2008-10-15 52 views
3

对不起,该标题只是伤害。我不知道是否有坍塌下面的代码段为单线一个LINQ到集合扩展方法:是否有一种linq-y方式来对联合对象集合的属性进行收集?

public IEnumerable<Child> GetAllChildren(IEnumerable<Parent> parents){ 

    var result = new List<Child>(); 

    foreach(Parent parent in parents) 
    foreach(Child child in parent.Children) 
     result.Add(child); 

    return result; 
} 

如果可以折叠到这一条语句,尝试在疯狂难度:

public IEnumerable<Child> GetAllChildren(IEnumerable<Grandparent> nanas){ 

    var result = new List<Child>(); 

    foreach(Grandparent papa in nanas) 
    foreach(Parent parent in papa.Children) 
     foreach(Child child in parent.Children) 
     result.Add(child); 

    return result; 
} 

回答

7

这里是强制性的方法形式。

return parents 
    .SelectMany(p => p.Children); 

并为两个层次:

return oldies 
    .SelectMany(grand => grand.Children) 
    .SelectMany(parent => parent.Children); 
9

这将工作:

public IEnumerable<Child> GetAllChildren(IEnumerable<Parent> parents) 
{ 
    return from parent in parents 
      from child in parent.Children 
      select child; 
} 

,然后这样的:

public IEnumerable<Child> GetAllChildren(IEnumerable<Grandparent> nanas) 
{ 
    return from papa in nanas 
      from parent in papa.Children 
      from child in parent.Children 
      select child; 
} 

请注意,在这个例子中,我并没有实际返回一个列表,我返回一个IEnumerable数据源,直到您开始对它进行foreach或类似的操作,实际上不会进行任何处理。

如果需要返回一个列表,修改每个return语句如下:

return (from ..... 
      ... 
      select child).ToList(); 
+0

返回值必须是一个IEnumerable,并做了最简单的方法(至少据我所知)是返回实现IEnumerable集合。感谢你的回答! – Will 2008-10-15 15:45:40

+0

您可以返回一个集合,或者使用yield return,如果您不熟悉msdn,可以在msdn上查找yield关键字。 – 2008-10-15 15:46:26

相关问题