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