Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用linq过滤两组键值对的差异?_C#_Linq - Fatal编程技术网

C# 如何使用linq过滤两组键值对的差异?

C# 如何使用linq过滤两组键值对的差异?,c#,linq,C#,Linq,我有两个要筛选的键值对列表 如果值与列表A中的键值不同,我想从列表B中检索键值对 List A List B <a,1> <b,4> <b,2> <c,5> <c,3> 列表A列表B 因此,如果我过滤上述两个键值对列表,我将得到以下结果: List c <b,4> <c,5> 列表c 不必使用foreach循环并检查单个键值,这是否可行?按键连接两个列表,然后选择具有不

我有两个要筛选的键值对列表

如果值与列表A中的键值不同,我想从列表B中检索键值对

List A      List B 
<a,1>       <b,4>
<b,2>       <c,5>
<c,3>
列表A列表B
因此,如果我过滤上述两个键值对列表,我将得到以下结果:

List c
<b,4>
<c,5>
列表c

不必使用foreach循环并检查单个键值,这是否可行?

按键连接两个列表,然后选择具有不同值的项目:

from kvpA in listA
join kvpB in listB on kvpA.Key equals kvpB.Key
where kvpA.Value != kvpB.Value
select kvpB
Lambda语法:

listA.Join(listB, 
           kvpA => kvpA.Key, 
           kvpB => kvpB.Key, 
           (kvpA, kvpB) => new { kvpA, kvpB })
     .Where(x => x.kvpA.Value != x.kvpB.Value)
     .Select(x => x.kvpB)
     .ToList()

试着这样做:

ListB.Where(kvpB => !ListA.Select(kvpA => kvpA.Value).Contains(kvpB.Value))

嗨,你能提供这个的lambda语法吗?@xerxes:你自己试过把它转换成lambda语法吗?当你陷入困境时,总是试着自己做事情并寻求帮助,而不仅仅是请求别人帮你做事情。@xerxes我不喜欢带有连接的lambda语法的样子,但肯定可以用lambdas完成。也同意Jon的观点,在提问之前,总是试着自己做一些事情,如果你想成为一名程序员对不起,我以前没有使用sugar语法,所以我真的不知道如何将其转换为lambda格式,但是感谢您提供的解决方案。@xerxes我建议您花一些时间研究sugar语法-它更易于使用和理解(因此是声明性的)。还有一个注意事项-您可以从列表中选择具有key和这两个值的匿名类型:
选择新的{key=kvpA.key,A=kvpA.Value,B=kvpB.Value}
可能会有用