由於您有兩個排序序列,您只需要將兩個序列合併爲一個序列,就像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
,將相應的流線。
遍歷兩個文件,再次提取全部A記錄,然後遍歷並提取B的?那隻會在內存中保留1條記錄,而不得不做4次完整的文件掃描。 –
請向我們展示您嘗試過的方式,並告訴我們您是否遇到特定問題。像這樣的問題通常被視爲「給我一個代碼」,並且對此不以爲然。 – cadrell0
你的檔案大小是? – didierc