C#合并两个SortedLists(Union?)

时间:2012-11-02 01:34:35

标签: c# c#-4.0 sortedlist

我希望加快一段合并两个SortedLists的代码。

C#4.0 generic SortedListhttp://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上实现联合。如果有人可以帮助我,我会很感激。

此外,如果有更好的方法可以做到这一点,我愿意接受建议。

2 个答案:

答案 0 :(得分:2)

我能想到合并两个SortedList实例的唯一方法是将它们联合起来,然后转换为查找,然后抓取查找集合的第一个元素来创建字典。

我需要制作字典,因为SortedList仅支持逐个添加。所以唯一的另一种选择是将字典注入SortedList构造函数。

结论:我认为你现在的代码非常不错。 LINQ可以帮助将代码减少到大约2行(如果你是受虐狂,则可以使用一行)。

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);

答案 1 :(得分:1)

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

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

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