字典与价值相交

时间:2014-10-22 14:22:56

标签: c# dictionary intersect

我有两个字典对象

我试图通过他们的值与DictB的DictA相交并返回带有结果的第3个字典

我能够这样做但是这只会产生一个整体列表

var results = DictA.Values.Intersect(DictB.Values);

这种方法很慢,

var results = DictA.Where(x => DictB.ContainsValue(x.Value)).ToDictionary(x => x.Key, x => x.Value);

表现是关键。每个字典都有数百万条记录。

如何实现相交的2个字典,产生第3个字典?

1 个答案:

答案 0 :(得分:0)

我认为如果搜索值,使用字典会导致性能问题;字典的键部分经过优化,可以提供O(1)性能; values集合基本上是一个ICollection,所以在O(n)上搜索它。

如果将值移动到HashSet中,那么您的性能将大幅提升;粗略的例子:

        var dict1 = new Dictionary<string, string>();
        var dict2 = new Dictionary<string, string>();

        for (var x = 0; x < 1000000; x++)
        {
            dict1.Add(x.ToString(), x.ToString());
        }

        for (var x = 0; x < 2000000; x+=2)
        {
            dict2.Add(x.ToString(), x.ToString());
        }

        var hs1 = new HashSet<string>(dict1.Values);
        var hs2 = new HashSet<string>(dict2.Values);

        hs1.IntersectWith(hs2);