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是否有一种简单的方法?
谢谢!
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
.
我怀疑你确实必须编写自己的比较器 - 至少要使用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)
归档时间: |
|
查看次数: |
1736 次 |
最近记录: |