使用LINQ从一个集合中查找不在另一个集合中的所有密钥?

Son*_*Boy 8 .net c# linq

我试图找到一个字典中不在另一个字典中的所有键.显然,我可以使用嵌套循环来做到这一点,但我现在正在尝试学习LINQ,我想知道是否可以使用它来完成这项任务?

这是我到目前为止所拥有的:

Dictionary<string, List<string>> DBtables = this.CollectTableListings();
var generic = from Dictionary<string,List<string>> tab
              in DBtables
              where !_tables.ContainsKey(???)
              select tab;
Run Code Online (Sandbox Code Playgroud)

任何想法应该代替问号(或者可能代替整个where子句)?

LBu*_*kin 11

你可以做:

var resultKeys = DBTables.Keys.Except( _tables.Keys );
Run Code Online (Sandbox Code Playgroud)

Except()方法与minusSQL中的操作基本相同- 它返回第一个集合中的所有项目,不包括第二个集合中的项目.由于字典暴露了它们的键,你可以用这种方式计算它们之间的差异.

Except()操作员使用该类型的默认相等,但也有过载,它允许你指定你自己的IEqualityComparer覆盖的如何比较值的语义.在你的例子中,你可能不需要 - 但在那里知道它很好.

  • 请注意,`除了()`返回**不同的**结果.虽然在这个例子中可能需要它,但值得注意在其他实现中使用. (4认同)