C# 使用LINQ根据项目过滤项目列表';出现在另一个列表中
我想通过练习来学习LINQ。这似乎是一种我应该能够使用它的情况,但我不太清楚这是否可能,或者我是不是找错了方向 在下面的用例中,我可以通过一行LINQ查询实现括号[]中的内容吗C# 使用LINQ根据项目过滤项目列表';出现在另一个列表中,c#,.net,linq,.net-3.5,C#,.net,Linq,.net 3.5,我想通过练习来学习LINQ。这似乎是一种我应该能够使用它的情况,但我不太清楚这是否可能,或者我是不是找错了方向 在下面的用例中,我可以通过一行LINQ查询实现括号[]中的内容吗 List<Command> list1, list2; PopulateCommandLists(list1, list2); foreach(Command cmd in list1) { if ([cmd.Name is present as the Name in any of list2'
List<Command> list1, list2;
PopulateCommandLists(list1, list2);
foreach(Command cmd in list1)
{
if ([cmd.Name is present as the Name in any of list2's Command objects])
{
//some code.
}
}
列表列表1、列表2;
PopulateCommandList(列表1、列表2);
foreach(列表1中的命令cmd)
{
如果([cmd.Name作为名称出现在任何list2的命令对象中])
{
//一些代码。
}
}
我想这就是你想要的
if (list2.Any(l2c => l2c.Name == cmd.Name))
{ ... }
但您可以将其添加到foreach
中,并避免代码中的if
:
foreach(Command cmd in list1.Where(l1c => list2.Any(l2c => l2c.Name == l1c.Name)))
{
... some code ...
}
如果您控制命令
类,并且可以在其中定义相等(覆盖相等等),则只需使用:
如果您不控制命令
或不想在类中定义相等,您仍然可以将Intersect
与
foreach(list1.Intersect(list2,newcommandcomparer())中的var cmd)
{ ... }
类CommandComparer:IEqualityComparer
{ ... }
我想你在找这样的东西
if(list2.Any(list2cmd=> list2cmd.Name == cmd.name))
{
// do stuff
}
试试这个:
if (list2.Any(item => item.Name == cmd.Name)) {
}
以下是该声明的“剖析”:
将其条件应用于Any
的每个项目,如果列表中的任何项目已返回list2
,则返回true
true
中的谓词测试Any
项的名称是否等于
cmd
if
折叠到LINQ中:
foreach (var cmd in list1.Where(c => list2.Any(item => item.Name == c.Name))) {
...
}
您可以通过以下方式获取可枚举项本身:
var query = list1.Where(cmd => (list2.Any(item => item.Name == cmd.Name)));
然后只需在查询上循环,该查询将包含所需的每个命令
:
foreach( Command cmd in query)
{
// Do something
}
在上一个代码中,使用
Where
调用,您不能将标识符cmd
用作lambda变量,因为已经有一个foreach
变量具有该名称。事实上,对不起,我错了!我刚测试过。看起来cmd
不在in
关键字后面的范围内,因此您的示例在编辑之前就已经运行了。抱歉,我说得太快了。@JeppeStigNielsen没关系,修改后的代码更容易阅读,因为它不会对每个变量的含义产生歧义,即使读者(包括我自己)对范围规则不是100%确定。哇,这个问题有很多很好的答案。:)谢谢大家!
foreach (var cmd in list1.Where(c => list2.Any(item => item.Name == c.Name))) {
...
}
var query = list1.Where(cmd => (list2.Any(item => item.Name == cmd.Name)));
foreach( Command cmd in query)
{
// Do something
}