Lambda表达式,用于筛选项目列表

本文关键字:项目 列表 筛选 用于 表达式 Lambda | 更新日期: 2023-09-27 18:28:29

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

以下是我的列表:

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

以下是我的Item类的样子:

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

我想筛选此列表,只获取项目名称="ABC"且项目操作="123"的项目列表。

感谢您的帮助

Lambda表达式,用于筛选项目列表

简单:

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();

以下是一个列表,该列表中包含一个匹配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);
}

我认为简单的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;

这可能会起作用;

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