3

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

5 回答 5

6

尝试这个:

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

以下是声明的“剖析”:

  • Any将其条件应用于 , 的每个项目list2true如果true已​​为列表中的任何项目返回,则返回
  • 里面的谓词Any测试item's name 是否等于 of cmd

您也可以将其折叠if到 LINQ 中:

foreach (var cmd in list1.Where(c => list2.Any(item => item.Name == c.Name))) {
    ...
}
于 2012-06-28T16:07:23.130 回答
5
if (list2.Any(x => x.Name == cmd.Name)) { }
于 2012-06-28T16:07:01.463 回答
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该类并可以在其中定义相等性(覆盖 Equals 等),您可以简单地使用Intersect

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

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

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

class CommandComparer : IEqualityComparer<Command>
{ ... }
于 2012-06-28T16:07:01.743 回答
3

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

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

然后只需循环查询,它将包含Command您想要的所有内容:

foreach( Command cmd in query)
{
    // Do something
}
于 2012-06-28T16:12:01.603 回答
3

我想你正在寻找这样的东西

if(list2.Any(list2cmd=> list2cmd.Name == cmd.name))
{
    // do stuff
}
于 2012-06-28T16:07:03.197 回答