我有几个巨大的已排序的可枚举序列,我想合并.这些列表被操作为IEnumerable但已经排序.由于输入列表已排序,因此应该可以在一次行程中合并它们,而无需重新排序任何内容.
我想保留deferred执行行为.
我试着编写一个天真的算法来做到这一点(见下文).但是,它看起来很丑陋,我确信它可以进行优化.它可能存在更多的学术算法......
IEnumerable<T> MergeOrderedLists<T, TOrder>(IEnumerable<IEnumerable<T>> orderedlists,
Func<T, TOrder> orderBy)
{
var enumerators = orderedlists.ToDictionary(l => l.GetEnumerator(), l => default(T));
IEnumerator<T> tag = null;
var firstRun = true;
while (true)
{
var toRemove = new List<IEnumerator<T>>();
var toAdd = new List<KeyValuePair<IEnumerator<T>, T>>();
foreach (var pair in enumerators.Where(pair => firstRun || tag == pair.Key))
{
if (pair.Key.MoveNext())
toAdd.Add(pair);
else
toRemove.Add(pair.Key);
}
foreach (var enumerator in toRemove)
enumerators.Remove(enumerator);
foreach (var pair in toAdd)
enumerators[pair.Key] = pair.Key.Current; …Run Code Online (Sandbox Code Playgroud)