快速/优雅的方法来查找List <keys>中不存在的字典键

时间:2019-08-07 11:10:05

标签: c# dictionary

我有一个词典A,我想以快速适当的方式找到B中未列出的int键。

Dictionary<int,object> A;

List<int> B;

我想得到

A KEYS ARE NOT EXISTING IN B

有没有一种快速而优雅的方法?

2 个答案:

答案 0 :(得分:5)

您可以尝试将Linq用于var result = A.Keys.Except(B);

答案 1 :(得分:1)

您可以制作一个new HashSet<int> (A.Keys),然后使用哈希集的ExceptWith()方法。

编辑: 因为您认为哈希会破坏性能,所以这里有一个示例代码,您可以将其放入linqpad。在大多数情况下,这仍然比仅使用LINQ .Except()

快30%
Dictionary<int, int> A = new Dictionary<int, int>();
List<int> B = new List<int>();

// test filling...
Random r = new Random();
for (int i = 0; i < 1000000; i++)
{
    int rnd = r.Next(0, 2000000);
    A[rnd] = rnd;

    rnd = r.Next(0, 2000000);
    B.Add(rnd);
}

// Get time for LINQ Except
Stopwatch w = Stopwatch.StartNew();
var count = A.Keys.Except(B).Count();
w.Stop();
w.Dump();
count.Dump("Count");

// Get time for Hashset
w = Stopwatch.StartNew();

HashSet<int> ha = new HashSet<int>(A.Keys);
ha.ExceptWith(B);
count = ha.Count;

w.Stop();
w.Dump();
count.Dump("Count");