c#在另一个List <t> </t> </t>中搜索List <t>

时间:2013-07-28 19:03:18

标签: c# linq generics

如何在另一个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(或包含取决于你如何看待它),该怎么办呢。

希望这是有道理的。

3 个答案:

答案 0 :(得分:3)

你可以得到像这样的内部对象 -

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

答案 1 :(得分:3)

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

首先,我们将外部对象过滤为仅包含Id == 2

的外部对象

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

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

进行过滤

答案 2 :(得分:0)

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

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