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

时间:2012-06-28 16:04:41

标签: 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's Command objects])
    {
        //some code.
    }
}

5 个答案:

答案 0 :(得分:6)

试试这个:

if (list2.Any(item => item.Name == cmd.Name)) {
}

这是声明的“解剖学”:

  • Any将其条件应用于list2的每个项目,如果已​​为列表中的任何项目返回true,则返回true
  • Any内的谓词item的名称与cmd的名称相同。

你也可以将if折叠成LINQ:

foreach (var cmd in list1.Where(c => list2.Any(item => item.Name == c.Name))) {
    ...
}

答案 1 :(得分:5)

if (list2.Any(x => x.Name == cmd.Name)) { }

答案 2 :(得分:5)

我认为这就是你想要的。

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 ...
}

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

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

如果你不控制Command或者不想在课堂上定义相等,你仍然可以Intersect使用IEqualityComparer

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

class CommandComparer : IEqualityComparer<Command>
{ ... }

答案 3 :(得分:3)

我认为你正在寻找像这样的东西

if(list2.Any(list2cmd=> list2cmd.Name == cmd.name))
{
    // do stuff
}

答案 4 :(得分:3)

您可以将枚举本身视为:

var query = list1.Where(cmd => (list2.Any(item => item.Name == cmd.Name)));

然后循环查询,其中包含您想要的每个Command

foreach( Command cmd in query)
{
    // Do something
}