2 つの並べ替えられたシーケンスがあるため、2 つのシーケンスを 1 つのシーケンスにマージするだけで済みます。これは、MergeSort アルゴリズムの後半が機能するのとほとんど同じです。
残念ながら、IEnumerable
提供するインターフェースを考えると、少しごちゃごちゃしてコピーペーストのようになりますが、非常にうまく機能し、非常に小さなメモリフットプリントを使用するはずです:
public class Wrapper<T>
{
public T Value { get; set; }
}
public static IEnumerable<T> Merge<T>(IEnumerable<T> first, IEnumerable<T> second, IComparer<T> comparer = null)
{
comparer = comparer ?? Comparer<T>.Default;
using (var secondIterator = second.GetEnumerator())
{
Wrapper<T> secondItem = null; //when the wrapper is null there are no more items in the second sequence
if (secondIterator.MoveNext())
secondItem = new Wrapper<T>() { Value = secondIterator.Current };
foreach (var firstItem in first)
{
if (secondItem != null)
{
while (comparer.Compare(firstItem, secondItem.Value) > 0)
{
yield return secondItem.Value;
if (secondIterator.MoveNext())
secondItem.Value = secondIterator.Current;
else
secondItem = null;
}
}
yield return firstItem;
yield return secondItem.Value;
while (secondIterator.MoveNext())
yield return secondIterator.Current;
}
}
}
関数ができたら、Merge
それはかなり簡単です。
File.WriteAllLines("output.txt",
Merge(File.ReadLines("File1.txt"), File.ReadLines("File2.txt")))
ファイルReadLines
とWriteAllLines
ここでは、それぞれが利用IEnumerable
され、それに応じてラインがストリーミングされます。