Lambda Expression用于过滤项列表的列表

时间:2012-03-21 19:07:21

标签: c# .net lambda

我有一个项目列表列表,我想知道是否有人可以帮我使用lambda表达式来过滤此列表。

以下是我的列表:

List<List<Item>> myList = ExtractList();

这是我的Item类的样子:

public class Item {
    public string Name {get;set;}
    public string Action {get;set;}
}

我想过滤此列表,只获取项目名称=“ABC”和项目操作=“123”的项目列表列表。

感谢您的帮助

4 个答案:

答案 0 :(得分:28)

简单:

myList.SelectMany(sublist => sublist)
    .Where(item => item.Name == "ABC" && item.Action == "123");

这为您提供了所有列表中的所有项目。

如果您想选择包含该项目的子列表:

myList.Where(sublist => sublist.Any(item => item.Name == "ABC" && item.Action == "123"));

最后,如果你想保留相同的结构,但只保留与过滤器匹配的项目:

var newList = myList.Select(sublist => sublist
                       .Where(item => item.Name == "ABC" && item.Action == "123")
                       .ToList()).ToList();

答案 1 :(得分:3)

这里有一个列表,其中列出了一个匹配Name =“ABC”和Action =“123”的项目列表。

var newList = myList.Where(l => 
             l.Exists(i => i.Name == "ABC" 
                    && i.Action == "123")).ToList();

如果只需要符合条件的列表项列表,则可以执行以下操作:

var newList = (from l in myList 
          where l.Exists(i => i.Name == "ABC" && i.Action == "123") 
          select l.Where(i => i.Name == "ABC" && i.Action == "123").ToList()).ToList();

要展平上面的列表(转换为简单列表而不是列表列表),您必须执行foreach循环:

List<Item> newList2 = new List<Item>();
foreach(var list in newList)
{
    newList2.AddRange(list);
}

答案 2 :(得分:0)

这可能有用;

List<Item> Items = new List<Item>();

myList.ForEach((item)=>
{
   var items = item.Where(q=> q.Action == "123" && q.Name =="ABC");
   Items.AddRange(items);
});

答案 3 :(得分:0)

我认为简单的LINQ语法是最容易理解的:

var newList =
    // gets the list of items
    from listOfItems in myList
    // extracts the list of items
    from item in listOfItems
    // filters by criteria
    where item.Name == "ABC" && item.Action == "123"
    // flattens into a IEnumerable<Item>
    select item;