Stream merge: Difference between revisions

1,629 bytes removed ,  3 years ago
Line 583:
 
=={{header|C sharp|C#}}==
<lang csharp>
{{trans|Java}}
<lang csharp>using System;
using System.Collections.Generic;
using System.Linq;
 
namespace StreamMerge {RosettaCode
{
class Program {StreamMerge
static void Merge2<T>(IEnumerable<T> i1, IEnumerable<T> i2, Action<T> output) where T : IComparable {
{
IEnumerator<T> e1 = i1.GetEnumerator();
static voidIEnumerable<T> Merge2<T>(IEnumerable<T> i1, IEnumerable<T> i2, Action<T> output) where T : IComparable {
IEnumerator<T> e2 = i2.GetEnumerator();
}{
 
boolvar hasAq1 = e1.MoveNextnew Queue<T>(i1);
boolvar hasBq2 = e2.MoveNextnew Queue<T>(i2);
while (hasAq1.Any() ||&& hasBq2.Any()) {
if (hasA) {
var c = if q1.Peek(hasB) {.CompareTo(q2.Peek());
if (c <= 0) yield return q1.Dequeue(); else IComparableyield a =return e1q2.CurrentDequeue();
IComparable b = e2.Current;
if (a.CompareTo(b) < 0) {
output.Invoke(e1.Current);
hasA = e1.MoveNext();
}
else {
output.Invoke(e2.Current);
hasB = e2.MoveNext();
}
}
else {
output.Invoke(e1.Current);
hasA = e1.MoveNext();
}
}
else if (hasB) {
output.Invoke(e2.Current);
hasB = e2.MoveNext();
}
}
while (q1.Any()) yield return q1.Dequeue();
while (q2.Any()) yield return q2.Dequeue();
}
 
static voidIEnumerable<T> MergeN<T>(Action<T> output, params IEnumerable<T>[] enumerables) where T : IComparable {
if (enumerables.Length == 0) {
var queues = enumerables.Select(e => new Queue<T>(e)).Where(q => q.Any()).ToList();
return;
}
if (enumerables.Length == 1) {
IEnumerator<T> e = enumerables[0].GetEnumerator();
while (e.MoveNext()) {
output.Invoke(e.Current);
}
return;
}
 
intwhile count = enumerables(queues.Length;Any())
else {
IEnumerator<T>[] eArr = new IEnumerator<T>[count];
var queueWithLowestItem = queues.Aggregate((q1, q2) => q1.Peek().CompareTo(q2.Peek()) <= 0 ? q1 : q2);
bool[] hasN = new bool[count];
for (int i = 0;yield ireturn < countqueueWithLowestItem.Dequeue(); i++) {
eArr[i]if =(!queueWithLowestItem.Any()) enumerables[i]queues.GetEnumeratorRemove(queueWithLowestItem);
hasN[i] = eArr[i].MoveNext();
}
 
while (hasN.Aggregate(false, (a, b) => a || b)) {
int index = -1;
T value = default(T);
for (int i = 0; i < count; i++) {
if (hasN[i]) {
if (index == -1) {
value = eArr[i].Current;
index = i;
}
else if (eArr[i].Current.CompareTo(value) < 0) {
value = eArr[i].Current;
index = i;
}
}
}
 
output.Invoke(value);
hasN[index] = eArr[index].MoveNext();
}
}
 
static void Main(string[] args) {
}{
List<int> a = new List<int>() { 1, 4, 7, 10 };
List<int>var ba = new List<int>()[] { 21, 54, 87, 1110 };
List<int>var cb = new List<int>()[] { 32, 65, 98, 1211 };
var c = new[] { 3, 6, 9, 12 };
 
foreach (var i in Merge2(a, b, m =>)) Console.Write($"{0i} ", m));
Console.WriteLine();
 
foreach (var i in MergeN(ma, =>b, c)) Console.Write($"{0i} ", m), a, b, c);
Console.WriteLine();
}
Anonymous user