7

我正在寻找加速合并两个SortedLists.

C# 4.0 通用SortedList: http: //msdn.microsoft.com/en-us/library/ms132319 (v=vs.100).aspx

public Trait getTrait(decimal thisValue)
{       
    if (ParentStructure != null && ParentStructure.RankedTraits.Count > 0)
    {
        SortedList<decimal, Trait> tempTraits = this.RankedTraits;

        // Improve here (union?)
        foreach (KeyValuePair<decimal, Trait> kvp in (ParentStructure.RankedTraits))
        {
            if (!tempTraits.ContainsKey(kvp.Key)) 
            { 
                tempTraits.Add(kvp.Key, kvp.Value); 
            }
        }
        return _getTrait(tempTraits, thisValue);
        }
    }
    return _getTrait(_rankTraits, thisValue);
}

我认为联合而不是foreach循环会更快,但我不知道如何在SortedList. 如果有人可以帮助我解决这个问题,我将不胜感激。

此外,如果总体上有更好的方法,我愿意接受建议。

4

2 回答 2

3

我能想到合并两个实例的唯一方法是SortedList将它们合并,然后转换为查找,然后获取查找集合的第一个元素以制作字典。

我需要制作一本字典,因为SortedList它只支持一一添加。因此,唯一的其他选择是将字典注入SortedList构造函数。

底线:我认为您当前的代码相当不错。LINQ 可以帮助将代码减少到大约 2 行(如果您是受虐狂,则可以减少 1 行)。

SortedList<decimal, Traits> listA = new SortedList<decimal, Traits>();
SortedList<decimal, Traits> listB = new SortedList<decimal, Traits>();

listA.Add(1m, new Traits { FieldName = "One" });
listA.Add(2m, new Traits { FieldName = "Two" });
listA.Add(3m, new Traits { FieldName = "Three" });

listB.Add(1m, new Traits { FieldName = "One" });
listB.Add(4m, new Traits { FieldName = "Four" });
listB.Add(5m, new Traits { FieldName = "Five" });

var listUnion = listA.Union(listB).ToLookup(k => k.Key, v => v.Value)
                     .ToDictionary(k => k.Key, v => v.First());
var listMerged = new SortedList<decimal, Traits>(listUnion);
于 2012-11-02T04:36:37.297 回答
2

SortedSet 有一个 UnionWith 方法,可以满足您的要求。我创建了自己的 SortedSet 实现,它执行得非常快。

http://msdn.microsoft.com/en-us/library/dd411939.aspx

没关系,我重新阅读了您的问题,您正在使用列表实现;但是,如果您可以找到一种方法来创建 EqualityComparer 而不是使用特定的键,则可以使 SortedSet 适应您的目的。

于 2012-11-02T01:40:21.173 回答