Wie benutze ich den gleichen Foreach-Code für 2 Sammlungen?

8

Ich habe 2 Sammlungen von 2 verschiedenen Arten, aber habe fast die gleiche Menge von Feldern. In einer Funktion muss ich eine der Sammlungen durchlaufen, abhängig von einer Bedingung. Ich möchte nur einen Codeblock schreiben, der beide Fälle abdeckt. Beispiel: Ich habe den folgenden Code:

%Vor%

Jetzt: Ich möchte diesen Code vereinfachen, um die gleiche Logik nur einmal zu verwenden (da sie identisch sind), etwas wie folgt (PS: Ich weiß, dass der folgende Code nicht korrekt ist, ich erkläre nur, was ich tun möchte ):

%Vor%

Die Definition von Type1 & amp; Type2 ähnelt dem folgenden Code (Tatsächlich sind sie Entity-Objekte):

%Vor%

Update 1:

Ich habe einen Beispielcode eingefügt, den ich innerhalb von foreach block verwende (ich greife auf öffentliche Eigenschaften der beiden Typen zu).

Update 2:

Ich habe Probe Type1 & amp; Type2-Definitionen, wie Sie sehen können Ich habe 2 gemeinsame öffentliche Eigenschaften in beiden Klassen, die ich in jedem Block aktualisieren möchte.

Update 3:

Es tut mir leid für die Verwirrung, Type1 & amp; Type2 werden von EntityObject abgeleitet (Sie sind beide Teil meines Entitätsmodells und die Type1Collection & amp; Type2Collection sind tatsächlich EntityCollection dieser 2 Entitäten.

    
Adel Khayata 26.01.2013, 05:08
quelle

6 Antworten

2

Da Jon Skeet die Methode Concat von LINQ verwendet und die Anweisung des OP, dass die beteiligten Klassen EntityObject s sind, ist hier eine weitere mögliche Lösung. Dies setzt voraus, dass die Unterklassen EntityObject als partielle Klassen definiert sind:

%Vor%

Dies ermöglicht dem OP, eine Schnittstelle mit den allgemeinen Eigenschaften zu deklarieren, und seine EntityObject -Unterklassen implementieren diese Schnittstelle:

%Vor%

Und der ursprüngliche Code wird:

%Vor%     
Edmund Schweppe 28.01.2013, 16:56
quelle
9

Sie könnten dynamic verwenden. Beachten Sie, dass Sie die Typsicherheit verlieren.

%Vor%

Oder wenn Sie eine gemeinsame Schnittstelle verwenden, können Sie direkt darauf zugreifen. Sie pflegen die Typsicherheit

%Vor%     
Simon 26.01.2013 05:16
quelle
0

Sie könnten einen Basistyp für type1 und type2 erstellen, der die gemeinsamen Eigenschaften zwischen den beiden Klassen gruppiert:

%Vor%

Dann könnten Sie so etwas tun:

%Vor%

BEARBEITEN: Wie Simon in den Kommentaren betont, sollten Sie anstelle eines Basistyps eine Schnittstelle verwenden, wenn dies ausreicht (d. H. Sie benötigen für beide Typen keine spezifische Implementierung).

    
Daniel Castro 26.01.2013 05:20
quelle
0

Das ist keine sehr schöne Methode, aber es würde zumindest funktionieren.

%Vor%     
Alexander Forbes-Reed 26.01.2013 15:47
quelle
0

Ich bin überrascht, dass noch niemand eine Erweiterungsmethode vorgeschlagen hat:

%Vor%

Nun müssen Ihre Originaltypen nur IMyType implementieren:

%Vor%

Dann wird der ursprüngliche Code:

%Vor%     
Edmund Schweppe 26.01.2013 19:14
quelle
0

Sie können dies mit Prädikat und Aktion tun, die in einem Dictionary gespeichert sind. Ich schlage Action vor, da das Code-Snippet anscheinend nichts zurückgibt.

%Vor%

Auf diese Weise verbessert sich die Lesbarkeit und Testbarkeit Ihres Codes und vermeidet auch lange Methoden.

Bearbeiten:

%Vor%     
quelle

Tags und Links