KeyValuePair键上的相交列表?

如何根据键输入两个KeyValuePairs列表? 我试过了:

List<KeyValuePair> listA = new List<KeyValuePair>(); List<KeyValuePair> listB = new List<KeyValuePair>(); ... var result = listA.Intersect(listB); 

这预计不起作用。 我是否需要根据键编写自己的比较器,或者使用LINQ / Lambda有一种简单的方法吗?

谢谢!

 var keysFromB = new HashSet(listB.Select(x => x.Key)); var result = listA.Where(x => keysFromB.Remove(x.Key)); 

请注意,此代码使用Remove方法模拟Intersect的行为。 这意味着两个序列都被视为集合:如果listA有多个具有相同键的项目,则result将只包含其中一个项目。 如果您不想要此行为,请使用Contains方法而不是Remove

怀疑你确实必须编写自己的比较器 – 至少要使用Intersect

您可以使用MiscUtil中的 ProjectionEqualityComparer来实现这一点:

 // Ick what a mouthful var comparer = ProjectionEqualityComparer>.Create (x => x.Key); var result = listA.Intersect(listB, comparer); 

如果每个列表中的键都是唯一的,则另一个选项是连接:

 var commonPairs = from pairA in listA join pairB in listB on pairA.Key equals pairB.Key select new { pairA, pairB };