3

すみません、そのタイトルはただ痛いです。次のコード セグメントを 1 行に折りたたむ 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;
}
4

2 に答える 2

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();
于 2008-10-15T15:27:52.680 に答える
7

必須のメソッド形式は次のとおりです。

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

2 つのレベルの場合:

return oldies
  .SelectMany(grand => grand.Children)
  .SelectMany(parent => parent.Children);
于 2008-10-15T16:04:30.593 に答える