使用Lambda表达式过滤多个项目列表的列表

14

我有一个项目列表的列表,我想知道是否有人能够帮我编写一个lambda表达式来过滤这个列表。

这是我的列表长什么样子:

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

这是我的Item类的样子:

public class Item {
    public string Name {get;set;}
    public string Action {get;set;}
}
我想筛选这个列表,并仅获取那些项名称为"ABC"且项操作为"123"的项目列表。
谢谢任何帮助。

2
你应该澄清一下最后一句话,你想要一个包含ABC/123的列表嵌套列表吗?还是你想要一个包含ABC/123的项目列表? - Guvante
我想要一个包含abc/123的列表列表。 - zSynopsis
4个回答

36

简单:

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

非常感谢!解决了我的问题。 - Almett

3
这里有一个能获取包含至少一个名称为 "ABC" 和操作为 "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);
}

可以使用myList.SelectMany(l => l).ToList()来展开列表,而不需要使用foreach。 - Roman Starkov

2

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

1

这可能有效;

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接