KeyValuePair键上的相交列表?

ehc*_*ian 3 c# linq lambda list

如何根据键输入两个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);
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Luk*_*keH 7

var keysFromB = new HashSet<string>(listB.Select(x => x.Key));
var result = listA.Where(x => keysFromB.Remove(x.Key));
Run Code Online (Sandbox Code Playgroud)

请注意,此代码模仿Intersect使用该Remove方法的行为.这意味着两个序列被作为一组处理:如果存在与在同一键的多个项目listA,然后result将只包含那些项目中的一个.如果您不想要此行为,请使用该Contains方法而不是Remove.


Jon*_*eet 5

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

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

// Ick what a mouthful
var comparer = ProjectionEqualityComparer<KeyValuePair<string, string>>.Create
       (x => x.Key);

var result = listA.Intersect(listB, comparer);
Run Code Online (Sandbox Code Playgroud)

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

var commonPairs = from pairA in listA
                  join pairB in listB on pairA.Key equals pairB.Key
                  select new { pairA, pairB };
Run Code Online (Sandbox Code Playgroud)