Stream merge: Difference between revisions
Content added Content deleted
Line 590: | Line 590: | ||
namespace RosettaCode |
namespace RosettaCode |
||
{ |
{ |
||
class StreamMerge |
static class StreamMerge |
||
{ |
{ |
||
static IEnumerable<T> Merge2<T>(IEnumerable<T> |
static IEnumerable<T> Merge2<T>(IEnumerable<T> source1, IEnumerable<T> source2) where T : IComparable |
||
{ |
{ |
||
var q1 = new Queue<T>( |
var q1 = new Queue<T>(source1); |
||
var q2 = new Queue<T>( |
var q2 = new Queue<T>(source2); |
||
while (q1.Any() && q2.Any()) |
while (q1.Any() && q2.Any()) |
||
{ |
{ |
||
Line 605: | Line 605: | ||
} |
} |
||
static IEnumerable<T> MergeN<T>(params IEnumerable<T>[] |
static IEnumerable<T> MergeN<T>(params IEnumerable<T>[] sources) where T : IComparable |
||
{ |
{ |
||
var queues = |
var queues = sources.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()) |
while (queues.Any()) |
||
{ |
{ |
||
var |
var q = queues.First(); |
||
queues.RemoveAt(0); |
|||
yield return q.Dequeue(); |
|||
if (q.Any()) |
|||
{ |
|||
var index = queues.BinarySearch(q, headComparer); |
|||
queues.Insert(index < 0 ? ~index : index, q); |
|||
} |
|||
} |
} |
||
} |
} |
||
static void Main( |
static void Main() |
||
{ |
{ |
||
var a = new[] { 1, 4, 7, 10 }; |
var a = new[] { 1, 4, 7, 10 }; |