我有一个项目列表列表,我想知道是否有人可以帮我使用lambda表达式来过滤此列表。
以下是我的列表:
List<List<Item>> myList = ExtractList();
这是我的Item类的样子:
public class Item {
public string Name {get;set;}
public string Action {get;set;}
}
我想过滤此列表,只获取项目名称=“ABC”和项目操作=“123”的项目列表列表。
感谢您的帮助
答案 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;