小编fra*_*nck的帖子

用于合并排序的IEnumerable <T>的最有效算法

我有几个巨大的已排序的可枚举序列,我想合并.这些列表被操作为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)

c# linq algorithm optimization performance

35
推荐指数
5
解决办法
6590
查看次数

标签 统计

algorithm ×1

c# ×1

linq ×1

optimization ×1

performance ×1