2017-02-15 6 views
1

3つのリストを繰り返し処理し、各組み合わせを処理する必要があります。最も外側および第2レベルのループ(list1/list2)の順序は、いくつかの順序規則に依存します。 また、前回のループ(list3)の前後にいくつかのロジックがあります。 ProcesPairメソッドは3つのアイテムをすべて使用し、その順序に依存します。C#2つのリストを交換 - 交換可能な内部/外部ループ

 if (order == Order.Right) 
     { 
      foreach (var a in list1) 
      { 
       foreach (var b in list2) 
       { 
        DoSomethingBefore(); 

        foreach (var c in list3) 
        { 
         ProcessPair(a, b, c); 
        } 

        DoSomethingAfter(); 
       } 
      } 
     } 
     else if (order == Order.Down) 
     { 
      foreach (var b in list2) 
      { 
       foreach (var a in list1) 
       { 
        DoSomethingBefore(); 

        foreach (var c in list3) 
        { 
         ProcessPair(a, b, c); 
        } 

        DoSomethingAfter(); 
       } 
      } 
     } 

何とかエレガントにすることはできますか?私はまあ、どのようにコード内のループを減らすために、Zipのようなものが、お互いに機能します。

+1

が 'ProcessPair'使用を行い、従ってサンプルコードの等価物は、このようにすることができどのようにして 'c'? –

+0

ああ、私はそれを修正した、ありがとう。 – Majak

+0

list1とlist2の項目が互換性のある型の 'IEnumerable'であった場合、前にlist1とlist2の代入をスワップするだけでループを書くことができます。 – dlatikay

答えて

2

ネストされたループは、LINQ SelectManyのインジケータです。

var pairs = 
    order == Order.Right ? list1.SelectMany(a => list2, (a, b) => new { a, b }) ? 
    order == Order.Down ? list2.SelectMany(b => list1, (b, a) => new { a, b }) : 
    null; 

if (pairs != null) 
{ 
    foreach (var pair in pairs) 
    { 
     DoSomethingBefore(); 
     foreach (var c in list3) 
     { 
      ProcessPair(pair.a, pair.b, c); 
     } 
     DoSomethingAfter(); 
    } 
} 
+0

私の友人に感謝、私はこの 'SelectMany'パターンと恋に落ちた!あなたはそれを使用するのが便利ではない場合、任意の推奨事項はありますか?私は私の多レベルの 'foreach'ループのすべてをリファクタリングするアイデアを得ているからです:)。 – Majak

+1

2つ以上の値に使用すると、それほど簡潔ではありません。また、ヒープ割り当てを作成する際のオーバーヘッドが少しあります(短命ですが)。それ以外はかなり便利です:) –

1

それとも別の方法に繰り返しコードをリファクタリング:

void ProcessPairs(List<int> list1, List<int> list2, List<int> list3) 
{ 
    foreach (var a in list1) 
     foreach (var b in list2) 
     { 
      DoSomethingBefore(); 

      foreach (var c in list3) 
       ProcessPair(a, b, c); 

      DoSomethingAfter(); 
     }   
} 

、次いで

if (order == Order.Right) 
     ProcessPairs(list1, list2, list3); 
    else if (order == Order.Down) 
     ProcessPairs(list2, list1, list3); 
+0

OKリストは同じタイプではありません。 – Majak

関連する問題