2010-12-14 5 views
2

Gibt es ein Sprachkonstrukt in C#, das die Abstraktion der Schleifen- (oder anderer) "äußeren" Verarbeitung ermöglicht?Aussortieren der Skelettverarbeitung (C#)

Ich habe eine ziemlich geradlinig verschachtelte Struktur (Listen von Listen von Ints sagen) und den Code, um durch jede der niedrigsten Ebenen zu "drehen". Der Code ist nicht kompliziert (noch nicht besonders lang), aber ich habe mehrere Funktionen, die unabhängig voneinander mit der untersten Ebene "interagieren" müssen und nur das Schleifenskelett kopiert haben, um dies zu tun. Es scheint mir eine Verschwendung.

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

Dies ist offensichtlich eine abgespeckte Beispiel, aber meine reale Welt ist ähnlich - ich am Ende immer wieder die äußere Verarbeitung Kopieren bis zu relativ wenigen inneren Linien der Arbeit verändern werden.

Meine vorläufige Lösung besteht darin, eine "processing" -Methode zu erstellen, die die Schleifen enthält und einen Enumeration (oder etwas) -Parameter abruft, um zu bestimmen, welche innere Funktion aufgerufen werden soll. Dann setzen Sie eine switch-Anweisung auf die "tun etwas" Ebene, die die richtige Unterfunktion aufruft.

Bin ich auf dem richtigen Weg oder gibt es einen einfacheren Weg? Ich könnte die switch-Anweisung mit einem Konzept von Funktionszeigern loswerden (übertrage einfach einen Funktionszeiger in die Verarbeitungsschleife und rufe es auf der do-was-Ebene auf), weiß aber nicht, ob das in C# möglich ist.

Antwort

2

(ein bisschen auf Oded Antwort auszuarbeiten)

Angenommen, Sie auf die gleiche Weise, und dass die einzige Unterschied zwischen der Kopie kleistert foreach ist die innerste verschachtelte Block dann könnten Sie kapseln alle Einschleifen in immer iterieren wollen Verfahren:

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

Die Aktion kann jedes der Formate, die für C# delegates akzeptiert (a delegieren ist C# 's Antwort auf C/C++ Funktionszeiger):

// 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

Danke für die Antwort und das Beispiel (Sorry @Oded - der Beispielcode hat den Unterschied gemacht). Ich hatte die Delegierten etwas angeschaut, aber alle Tutorials und Hilfedateien ließen sie in die Ereignisse eingebunden erscheinen, also war ich weitergezogen. Das ist sehr hilfreich. – ktharsis

1

Sie können Action delegate übergeben - das ist die Funktion, die die eigentliche Operation innerhalb der äußeren Schleife ausführt.