搜索列表清单

时间:2018-08-27 09:45:46

标签: c# .net linq

我有以下对象:

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(),但没有运气。

4 个答案:

答案 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>>委托以过滤实际列表