KeyValuePair键上的相交列表?

时间:2010-09-13 15:29:44

标签: c# linq list lambda

如何根据键输入两个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是否有一种简单的方法?

谢谢!

2 个答案:

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