2016-09-08 6 views
1

私の目標は、LINQライブラリ関数をマスターすることです。C#LINQ、foreachにネストされたいくつかの並列forループを変換する

私の質問は、SelectManyの繰り返しで複数のSelectを呼び出すにはどうすればいいですか?

は、次のコードを考えてみましょう:

foreach(var i in array){ 
    for(int i=0; i<10; i++) 
     yield return someOtherArray[i]; 
    for(int i=0; i<10; i++) 
     yield return someOtherArray[i]; 
} 

私はネストされた1つのループとの変換を知って、

return array.SelectMany(x => 
      Enumerable.Range(0,10) 
      .Select(i => someOtherArray[i])); 

が、どのように地球上で私はselectManyスコープ内ループのための別の分離された内部に轢きません?私は親配列

foreach(var i in array) { 
    for(int i=0; i<10; i++) 
     yield return someOtherArray_A[i]; 
    for(int i=0; i<10; i++) 
     yield return someOtherArray_B[i]; 
} 

編集ように変化させるための謝罪#2

内側2列上で実行する必要が


編集#1

多くのインプット、私は試している私の本当の問題に近づけるために。

foreach(var j in array) { 
    for(int i=0; i<20; i++) 
     yield return someOtherArray_A[i]; 
    for(int i=0; i<10; i++) 
     yield return someOtherArray_B[i]; 
} 
+1

あなたは '連合(見ていました)'、複数の出力を組み合わせること「選択」? –

+1

「連合」ではなく「連合」 –

+0

このコード全体は私には意味を持たず、コンパイルもしません。あなたは正確に何をしようとしていますか? – user3185569

答えて

7

現在のコードはあまり意味がありません。さて、あなたのコードを変更して、それが意味をなさないようにすると、それは、例えば、このようになります。

foreach(var item in array){ 
    for(int i=0; i<10; i++) 
     yield return item.someArray[i]; 
    for(int i=0; i<10; i++) 
     yield return item.someOtherArray[i]; 
} 

内側ループは、外側ループからのデータに対して反復処理を行います。

Linqを使用すると、どのように見えますか?

return array.SelectMany(x => 
    x.someArray.Take(10).Concat(
     x.someOtherArray.Take(10) 
    ) 
); 

あなたは1つのより長い配列に内部シーケンスを組み合わせること.SelectMany()を使用することができ、あなたは、2つの配列を一緒に接着する.Concat()を使用することができ、そして一人としてそれを使用しています。コードのマールテンの賢明なバージョン@使用

+0

あなたの例でTakeを使って両方の配列から値を返すと、各繰り返しでどのくらい正確に戻ってくるかわからない –

+0

@ USS-Montanaこれは別の質問です。 – Maarten

+0

@ USSモンタナあなたは元のループはあなたのコメントであなたが言っていることさえしません。 – user3185569

0

foreach(var item in array){ 
    for(int i=0; i<10; i++) 
     yield return item.someArray[i]; 
    for(int i=0; i<10; i++) 
     yield return item.someOtherArray[i]; 
} 

は、だから、すべての(外側)配列の両方(内部)の配列の最初の10個の要素を返したいです。

は、だから我々はこのように内部をLINQ-IFYことができます。

item.someArray.Take(10)    // the first 10 elements of this array 
     .Concat(       // followed by 
      item.someOtherArray.Take(10)); // the first 10 elements of this array 
} 

これは、内部配列がありどんなタイプのIEnumerableを返します。 今、私たちは、外側アレイ内のすべてのアイテムのためにこれを行うとSelectManyはまったく同じものです単一のシーケンス、としてそれを返すようにしたい:

array.SelectMany(item => item.someArray.Take(10).Concat(item.SomeOtherArray.Take(10))); 
+0

アレイが<10個のアイテムを持っている場合は全く同じ挙動ではありません – Rawling

+0

本当ですが、OPがこのことについて学んでいるので、私はこのバージョンが一般的な意味で優れていると主張します。 – Rik

関連する問題