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