簡體   English   中英

使用LINQ根據這些項目在另一個列表中的存在來過濾項目列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM