[英]Using LINQ to filter a list of items based on those items' presence in another list
我正在嘗試通過練習來學習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.
}
}
嘗試這個:
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))) {
...
}
if (list2.Any(x => x.Name == cmd.Name)) { }
我想這就是你想要的。
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
或不想在類中定義相等性,您仍然可以使用與IEqualityComparer
Intersect
foreach(var cmd in list1.Intersect(list2, new CommandComparer()))
{ ... }
class CommandComparer : IEqualityComparer<Command>
{ ... }
我想你正在尋找這樣的東西
if(list2.Any(list2cmd=> list2cmd.Name == cmd.name))
{
// do stuff
}
您可以將枚舉本身視為:
var query = list1.Where(cmd => (list2.Any(item => item.Name == cmd.Name)));
然后循環查詢,它將包含您想要的每個Command
:
foreach( Command cmd in query)
{
// Do something
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.