Пример #1
0
            public int Compare(WrappedEnvelope x, WrappedEnvelope y)
            {
                var baseCompare = priorityCalculator(x.Envelope.Message).CompareTo(priorityCalculator(y.Envelope.Message));

                if (baseCompare != 0)
                {
                    return(baseCompare);
                }
                return(x.SequenceNumber.CompareTo(y.SequenceNumber));
            }
        /// <summary>
        /// Enqueues a message into the priority queue.
        /// </summary>
        /// <param name="item">The item to enqueue.</param>
        public void Enqueue(Envelope item)
        {
            int seq = Interlocked.Increment(ref sequenceNumber);
            var wrappedItem = new WrappedEnvelope(item, seq);

            _data.Add(wrappedItem);
            var ci = _data.Count - 1; // child index; start at end
            while (ci > 0)
            {
                var pi = (ci - 1) / 2; // parent index
                if (comparator.Compare(_data[ci], _data[pi]) >= 0) break; // child item is larger than (or equal) parent so we're done
                var tmp = _data[ci]; _data[ci] = _data[pi]; _data[pi] = tmp;
                ci = pi;
            }
        }