2010-12-14 15 views
2

ループ(または他の)「外側」処理の抽象化を可能にするC#の言語構成はありますか?スケルトン処理の抽出(C#)

私は非常にストレートな前方ネスト構造(intのリストのリスト)と、最下位レベルのintのそれぞれを "回転"するコードを持っています。コードは複雑ではありません(特に長いです)が、私は独立した最低レベルと "相互作用"する必要がある複数の関数を持っており、ループスケルトンをコピーするだけです。私に無駄なようだ。

foreach (list in outerlists) 
    ... a few random lines of structure traversing 
    foreach (int in list) 
     do something simple to int 

これは明らかに縮小した例であるが、私の現実の世界は似ている - 私は仕事の比較的少ない内側の行を変更するために繰り返し外処理をコピーしてしまいます。

私の暫定的な解決策は、ループを含む「処理」メソッドを作成し、どの内部関数を呼び出すかを示す列挙(または何か)のパラメータを取ることです。次に、適切なサブ関数を呼び出すdo somethingレベルでswitch文を実行します。

私は正しい道にいるのですか、それとも簡単な方法がありますか?私は関数のポインタの概念(単に処理ループに関数ポインタを渡し、何かのレベルでそれを呼び出す)のコンセプトでswitch文を取り除くことができますが、C#で可能かどうかわからないのですか?

答えて

2

(オデッドの答えにビットを起草)

あなたはいつも同じ方法を反復処理したいと仮定すると、コピー&ペーストのforeachの間で異なる唯一のことは、最も内側にネストされたブロックである、あなたがすべてにループカプセル化することができること方法:

public void DoStuffOnInnerElements (Action<int> theStuffToDo) 
{ 
    foreach (var subList in outerLists) 
    { 
     // a few random lines here... 
     foreach (int item in subList) 
     { 
      theStuffToDo(item); 
     } 
    } 
} 

アクションはC#がdelegatesのために受け入れフォーマット(デリゲートは、C/C++の関数ポインタにC#の答えである)のいずれかになります

// Lambdas 
DoStuffOnInnerElements((i) => Console.WriteLine(i)); 
// Methods 
DoStuffOnInnerElements(My_Void_xxx_Int_Method); 
DoStuffOnInnerElements(new Action<int>(Console.WriteLine)); 
// anonymous delegates 
DoStuffOnInnerElements(delegate(int i) { Console.WriteLine(i); }); 
// etc. 
+0

答えとそのサンプル(申し訳ありません@Oded - サンプルコードが違いを作ってくれてありがとう)をありがとう。私はデリゲートを少し見ていたが、すべてのチュートリアルやヘルプファイルはイベントに結びついているように見えたので、私は移動した。これは本当に役に立ちます。 – ktharsis

1

Action delegateを渡すことができます。これは外側のループ内で実際の操作を行う関数になります。