如何根据键输入两个KeyValuePairs列表?我试过了:
List<KeyValuePair<string, string>> listA = new List<KeyValuePair<string, string>>();
List<KeyValuePair<string, string>> listB = new List<KeyValuePair<string, string>>();
...
var result = listA.Intersect(listB);
预计哪个不起作用。我是否需要根据键编写自己的比较器,或者使用LINQ / Lambda是否有一种简单的方法?
谢谢!
答案 0 :(得分:7)
var keysFromB = new HashSet<string>(listB.Select(x => x.Key));
var result = listA.Where(x => keysFromB.Remove(x.Key));
请注意,此代码使用Intersect
方法模仿Remove
的行为。这意味着两个序列都被视为集合:如果listA
中有多个具有相同键的项目,则result
将只包含其中一个项目。如果您不想要此行为,请使用Contains
方法代替Remove
。
答案 1 :(得分:5)
我怀疑你确实必须编写自己的比较器 - 至少要使用Intersect
。
你可以使用MiscUtil中的ProjectionEqualityComparer来实现这一点:
// Ick what a mouthful
var comparer = ProjectionEqualityComparer<KeyValuePair<string, string>>.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 };