Frage

Lassen Sie sich mit dem folgenden Code-Schnipsel starten:

Foreach(Record item in RecordList){
  ..
  item = UpdateRecord(item, 5);
  ..
}

Die UpdateRecode Funktion ändert einiges Feld Element und gibt das geändertene Objekt. In diesem Fall führt der Compiler eine Ausnahme von selbst, dass das Element nicht in einer foreach-Iteration aktualisiert werden kann.

Nun wird die Updatemethode geändert, so dass es void zurückgibt und das Snippet würde wie folgt aussehen:

Foreach(Record item in RecordList){
  ..
  UpdateRecord(item, 5);
  ..
}

In diesem Fall würde das Element aktualisiert werden, da Nehmen Sie ein Referenztyp ist. Aber es macht den Code nicht lesbar.

Das Projekt arbeite ich an hat viele foreach-Schleifen mit dem fast dem gleichen Code immer und immer wieder, so würde Ich mag Methoden Teile, die Aktualisierung der Datensätze erstellen. Gibt es eine schöne Möglichkeit, dies zu tun? Eines, das den Code besser lesbar statt Wegwerfen es weiter mehr?

machen
War es hilfreich?

Lösung

Wenn Sie eine Sammlung aktualisieren müssen, nicht ein Iterator Muster verwenden, wie Sie gesagt hat, sein entweder fehleranfällig, oder riecht schlecht.

Ich finde, dass etwas klarer in dieser Situation mit einem Index unter Verwendung eines for-Schleife, da sein sehr offensichtlich, was Sie versuchen, so zu tun.

Andere Tipps

Der Compiler beschwert sich, dass Sie die nicht aktualisieren kann Sammlung , den Datensatz nicht. Mit dem Artikel zu tun = Update werden Neuzuweisung Sie das Iteratorvariable Element.

Ich bin nicht einverstanden, dass Update (Artikel 5) in irgendeiner Weise nicht lesbar ist - aber wenn es macht Sie sich besser fühlen, kann eine Verlängerung Verfahren machen es klar, dass Sie den Inhalt des Artikels ändern

.
static void Update(this Record item, int value) {
   // do logic
}

foreach (Record item in RecordList) {
   item.Update(5);
}

Sie benötigen die gleiche Liste aktualisieren? Könne Sie stattdessen eine neue (aktualisiert) Aufzählung zurückkehren?

foreach(Record item in RecordList){
  ..
  yield return GetUpdatedRecord(item, 5);
  ..
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top