【问题标题】:Using LINQ to filter a list of items based on those items' presence in another list使用 LINQ 根据项目在另一个列表中的存在来过滤项目列表
【发布时间】:2012-06-30 04:56:06
【问题描述】:

我正在尝试通过实践来学习 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.
    }
}

【问题讨论】:

  • 哇,这个问题有很多很好的答案。 :) 谢谢大家!

标签: c# .net linq .net-3.5


【解决方案1】:

试试这个:

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

【讨论】:

  • 在您的最后一个代码中,通过 Where 调用,您不能将标识符 cmd 用作 lambda 变量,因为已经有一个具有该名称的 foreach 变量。
  • 其实,对不起,我错了!我刚刚测试了它。看起来 cmd 不在 in 关键字之后的范围内,因此您的示例在您编辑之前有效。抱歉,我的速度太快了。
  • @JeppeStigNielsen 没关系,修改后的代码更易于阅读,因为它不会对每个变量的含义产生歧义,即使读者(包括我自己)不是 100% 确定范围规则.
【解决方案2】:

我想这就是你想要的。

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 类并且可以在其中定义相等(覆盖Equals 等),您可以简单地使用Intersect

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

如果您不控制Command 或不想在类中定义相等性,您仍然可以将IntersectIEqualityComparer 一起使用

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

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

【讨论】:

    【解决方案3】:
    if (list2.Any(x => x.Name == cmd.Name)) { }
    

    【讨论】:

      【解决方案4】:

      我认为您正在寻找类似的东西

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

      【讨论】:

        【解决方案5】:

        您可以将可枚举本身获取为:

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

        然后只需循环查询,它将包含您想要的每个Command

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

        【讨论】:

          猜你喜欢
          • 2015-06-04
          • 2021-12-17
          • 2022-01-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多