对不起,这个标题只是伤害了。我想知道是否有一个Linq to collections扩展方法将以下代码段折叠成一行:
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;
}
答案 0 :(得分: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数据源,直到你开始使用它,或类似的,实际上不会进行任何处理。
如果需要返回列表,请按如下所示修改每个return语句:
return (from .....
...
select child).ToList();
答案 1 :(得分:7)
这是强制性的方法形式。
return parents
.SelectMany(p => p.Children);
有两个级别:
return oldies
.SelectMany(grand => grand.Children)
.SelectMany(parent => parent.Children);