是否有一种linq-y方式来联合对象集合的集合属性?

时间:2008-10-15 15:25:44

标签: linq linq-to-objects

对不起,这个标题只是伤害了。我想知道是否有一个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;
}

2 个答案:

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