Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.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#_.net_Linq_.net 3.5 - Fatal编程技术网

C# 使用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'

我想通过练习来学习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'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
}