c#搜索列表<;t>;在另一个列表<;T>;

本文关键字:gt 列表 lt 另一个 搜索 | 更新日期: 2023-09-27 18:25:26

如何在List<t>中的另一个List<t> 中搜索值

//FooInner Class
public class FooInner {
  public int FooInnerId { get; set; }
  public String FooValue { get; set; }
}   
//FooOuter Class
public class FooOuter {
  public int FooOuterId { get; set; }
  public List<FooInner> FooInnerCollection { get; set; }
}

如果我只是想在外部类中找到一个值

// Working code
List<FooOuter> fooOuterCollection = GetSomeData(); 
var tmp = fooOuterCollection.Find( f => f.FooOuterId == 2 );

但是,如果我想要FooInner对象,其中FooOuterId == 2FooInnerCollection.FooInnerId == 4(或包含,具体取决于您如何看待它)。

希望这是有道理的。

c#搜索列表<;t>;在另一个列表<;T>;

fooOuterCollection
    .Where(outer => outer.FooOuterID == 2)
    .SelectMany(outer => outer.FooInnerCollection)
    .FirstOrDefault(fooInner => fooInner.FooInnerId == 4);

首先,我们过滤外部对象,使其仅包括Id==2 的对象

然后我们使用SelectMany来压平我们可能找到的多个InnerCollection

最后,我们根据内部Id==4

进行过滤

您可以获得这样的内部对象-

var temp=  fooOuterCollection.Where(f => f.FooOuterId == 2)
            .SelectMany(f => f.FooInnerCollection)
            .FirstOrDefault(fi => fi.FooInnerId == 4));

如果您需要外部对象,则需要使用Any()扩展方法来查看inner list contains required element-

var temp = fooOuterCollection.FirstOrDefault(f => f.FooOuterId == 2 &&
               f.FooInnerCollection.Any(fi => fi.FooInnerId == 4);

您可以使用LINQ的查询语法:

var results = from o in outerList
      where o.FooOuterId == 2
      from i in o.FooInnerCollection
      where i.FooInnerId == 4
      select i;