我有以下对象:
List<List<MyObj>> lst;
我需要在内部列表中找到ID为1的所有对象(List
我尝试过:
lst.Where(x => x.FindAll(y=> y.ID== "1"));
lst.FindAll(x => x.FindAll(y=> y.ID== "1"));
,还尝试使用Any()
,但没有运气。
答案 0 :(得分:6)
您可以使用SelectMany()
展平列表,然后过滤元素:
var result = lst.SelectMany(x => x).Where(y => y.ID == "1").ToList();
答案 1 :(得分:4)
List<MyObj> list1 = lst.SelectMany(x => x.Where(y=> y.ID== "1")).ToList();
或
List<List<MyObj>> list2 = lst.Where(x => x.Any(y=> y.ID== "1")).ToList();
取决于您想要的结果。
答案 2 :(得分:2)
SelectMany是您的朋友。示例:
var listOfListsOfStrings = new List<List<string>>();
listOfListsOfStrings.Add(new List<string>() {"a", "b"});
listOfListsOfStrings.Add(new List<string>() {"c", "d"});
var allStrings = listOfListsOfStrings.SelectMany(s => s);
Console.WriteLine(string.Join(", ", allStrings.ToArray())); //prints: a, b, c, d
因此,您只需要:
lst.SelectMany(x => x).Where(y => y.ID == "1")
答案 3 :(得分:1)
让我在已经很好的一组选项中添加另一个选项。它使用Hashset<T>
进行搜索,通过转换内部List<T>
,这将在数据量更大时有所帮助,因为Hashset<T>
的搜索范围是O(1)而不是O(N) {1}}
List<T>
如果您不希望进行转换,则可以使用以下代码:
List<List<MyObj>> lst;
var result = lst.where(x =>
{
// Assuming ID to be string type
var hashset = new Hashset<string>(x.Select(y => y.ID));
return hashset.Contains("1");
}
);
var result = lst.where(x => x.Any(y => y.ID == "1"));
的类型为result
,该类型将被过滤,目前,当在运行时提供数据时,我们正在向List<List<MyObj>>
提供Func<T,bool>
,那么它更容易构造Enumerable.Where
,在运行时将其编译成正确的Expression<Func<T,bool>>
委托以过滤实际列表