Stream merge: Difference between revisions

Line 590:
namespace RosettaCode
{
static class StreamMerge
{
static IEnumerable<T> Merge2<T>(IEnumerable<T> i1source1, IEnumerable<T> i2source2) where T : IComparable
{
var q1 = new Queue<T>(i1source1);
var q2 = new Queue<T>(i2source2);
while (q1.Any() && q2.Any())
{
Line 605:
}
 
static IEnumerable<T> MergeN<T>(params IEnumerable<T>[] enumerablessources) where T : IComparable
{
var queues = enumerablessources.Select(e => new Queue<T>(e)).Where(q => q.Any()).ToList();
var headComparer = Comparer<Queue<T>>.Create((x, y) => x.Peek().CompareTo(y.Peek()));
 
queues.Sort(headComparer);
while (queues.Any())
{
var queueWithLowestItemq = queues.AggregateFirst((q1, q2) => q1.Peek().CompareTo(q2.Peek()) <= 0 ? q1 : q2);
yield return queueWithLowestItemqueues.DequeueRemoveAt(0);
ifyield (!queueWithLowestItem.Any())return queuesq.RemoveDequeue(queueWithLowestItem);
if (q.Any())
{
var index = queues.BinarySearch(q, headComparer);
queues.Insert(index < 0 ? ~index : index, q);
}
}
}
 
static void Main(string[] args)
{
var a = new[] { 1, 4, 7, 10 };
Anonymous user