2016-08-22 3 views
0

入力と出力なしでこれを説明するのは難しいです。私はプロジェクトの不必要な詳細を避けるために簡単なCarの例を作りました。SelectManyの反対は何ですか?

私はこのリストを持っている:

List<car> cars = new List<car>() 
{ 
    new car() { carname = "bmw", carwheels = new List<int>() { 1, 2, 3, 4 } }, 
    new car() { carname = "cadillac", carwheels = new List<int>() { 1, 2, 3, 4 } }, 
    new car() { carname = "mustang", carwheels = new List<int>() { 1, 2, 3, 4 } } 
}; 

私は拡張クラスで出力これにしたい:

{ 
    { carname = "bmw", carwheel = 1 }, 
    { carname = "bmw", carwheel = 2 }, 
    { carname = "bmw", carwheel = 3 }, 
    { carname = "bmw", carwheel = 4 }, 
    { carname = "cadillac", carwheel = 1 }, 
    { carname = "cadillac", carwheel = 2 }, 
    { carname = "cadillac", carwheel = 3 }, 
    { carname = "cadillac", carwheel = 4 }, 
    { carname = "mustang", carwheel = 1 }, 
    { carname = "mustang", carwheel = 2 }, 
    { carname = "mustang", carwheel = 3 }, 
    { carname = "mustang", carwheel = 4 } 
} 

はIEnumerableを拡張メソッドによって投影でこれを行うためにそこに方法は何ですか? SelectMany()の反対のように動作するもの。

+11

なぜ、「SelectMany」とまったく同じではないのですか? –

+0

@TimSchmelter - 私の理解によれば、 'SelectMany()'は一番下のリストを取り、それを単体にフラット化し、それぞれが車輪のリストを持っています。 SelectMany()に別のオーバーロードがありますか? – BeemerGuy

+0

これは 'SelectMany'の反対ではなく、* SelectManyです。 – dasblinkenlight

答えて

6

と反対のSelectMany()ですが、正確にはSelectMany()のものです。あなたはそのようにこれを達成することができます

var result = cars.SelectMany(c => 
      c.carwheels.Select(w => new 
      { 
       carname = c.carname, 
       carwheel = w 
      })).ToList(); 

インナーSelectプロジェクト各車のホイールは、(あなたの指定されたプロパティを持つ匿名型の私のコードで)新しいオブジェクトに。そして外側のSelectMany()は、これらのシーケンスを1つのリストにまとめます。

+0

はい、私の頭をしばらく回転させています。あなたが正しいです - 私の誤解を招くタイトルには申し訳ありません。これはまさに私が必要なものです! – BeemerGuy

-2

多分、この解決策は役に立つでしょうか?これは、IEnumerableを固定サイズのIEnumerableをにあなたのIEnumerableを分割します

public static class EnumerableExtension 
{ 
    private static IEnumerable<T> GetChunk<T>(IEnumerator<T> source, int size) 
    { 
     yield return source.Current; 

     for (int i = 1; i < size; i++) 
     { 
      if (source.MoveNext()) 
      { 
       yield return source.Current; 
      } 
      else 
      { 
       yield break; 
      } 
     } 
    } 

    public static IEnumerable<IEnumerable<T>> SplitToChunks<T>(this IEnumerable<T> source, int size) 
    { 
     if (size < 1) 
     { 
      throw new ArgumentOutOfRangeException(); 
     } 

     using (var enumerator = source.GetEnumerator()) 
     { 
      while (enumerator.MoveNext()) 
      { 
       yield return GetChunk(enumerator, size); 
      } 
     } 
    } 

} 

申し訳ありませんが、適切に質問)私は冗長なLINQの構文がより読みやすい見つけるまれなケースの一つだ

2

読んでいない:

var query = from car in cars 
      from carwheel in car.carwheels 
      select new { car.carname, carwheel }; 
関連する問題