使用LINQ根据这些项目在另一个列表中的存在来过滤项目列表

Joh*_*0te 3 .net c# 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's Command objects])
    {
        //some code.
    }
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 6

试试这个:

if (list2.Any(item => item.Name == cmd.Name)) {
}
Run Code Online (Sandbox Code Playgroud)

这是声明的"解剖学":

  • Any其适用条件的每个项目list2,并返回true如果true已经从列表中返回任何项目
  • 内部Any测试中的谓词item的名称等于cmd.

你也可以折叠if成LINQ:

foreach (var cmd in list1.Where(c => list2.Any(item => item.Name == c.Name))) {
    ...
}
Run Code Online (Sandbox Code Playgroud)


sis*_*sve 5

if (list2.Any(x => x.Name == cmd.Name)) { }
Run Code Online (Sandbox Code Playgroud)


Aus*_*nen 5

我想这就是你想要的.

if (list2.Any(l2c => l2c.Name == cmd.Name))
{ ... }
Run Code Online (Sandbox Code Playgroud)

但你可以将它添加到foreach并避免if在你的代码中:

foreach(Command cmd in list1.Where(l1c => list2.Any(l2c => l2c.Name == l1c.Name)))
{
    ... some code ...
}
Run Code Online (Sandbox Code Playgroud)

如果你控制Command类并且可以在其中定义相等(覆盖Equals等),你可以简单地使用Intersect:

foreach(var cmd in list1.Intersect(list2))
{ ... }
Run Code Online (Sandbox Code Playgroud)

如果你不控制Command或不想在类定义平等,你仍然可以使用IntersectIEqualityComparer

foreach(var cmd in list1.Intersect(list2, new CommandComparer()))
{ ... }

class CommandComparer : IEqualityComparer<Command>
{ ... }
Run Code Online (Sandbox Code Playgroud)