Ejemplo n.º 1
0
        public static IEnumerable <PostprocessedMessage> MergePostprocessedMessage(IEnumerable <PostprocessedMessage>[] enums)
        {
            var comparer = new EnumeratorsComparer();
            var iters    = new VCSKicksCollection.PriorityQueue <IEnumerator <PostprocessedMessage> >(comparer);

            try
            {
                foreach (var e in enums)
                {
                    var i = e.GetEnumerator();
                    if (i.MoveNext())
                    {
                        iters.Enqueue(i);
                    }
                }
                for (; iters.Count > 0;)
                {
                    var i = iters.Dequeue();
                    try
                    {
                        yield return(i.Current);

                        if (i.MoveNext())
                        {
                            iters.Enqueue(i);
                            i = null;
                        }
                    }
                    finally
                    {
                        if (i != null)
                        {
                            i.Dispose();
                        }
                    }
                }
            }
            finally
            {
                while (iters.Count != 0)
                {
                    iters.Dequeue().Dispose();
                }
            }
        }
Ejemplo n.º 2
0
        public static IEnumerable <T> MergeSortedSequences <T>(this IEnumerable <T>[] enums, IComparer <T> valueComparer)
        {
            var comparer = new EnumeratorsComparer <T>(valueComparer);
            var iters    = new VCSKicksCollection.PriorityQueue <IEnumerator <T> >(comparer);

            try
            {
                foreach (var e in enums)
                {
                    var i = e.GetEnumerator();
                    if (i.MoveNext())
                    {
                        iters.Enqueue(i);
                    }
                }
                for (; iters.Count > 0;)
                {
                    var i = iters.Dequeue();
                    try
                    {
                        yield return(i.Current);

                        if (i.MoveNext())
                        {
                            iters.Enqueue(i);
                            i = null;
                        }
                    }
                    finally
                    {
                        if (i != null)
                        {
                            i.Dispose();
                        }
                    }
                }
            }
            finally
            {
                while (iters.Count != 0)
                {
                    iters.Dequeue().Dispose();
                }
            }
        }