Ersetzen von for... if Array-Iterationen in C#

Wenn Sie ein Entwickler sind, der mit Arrays und Schleifen in C# gearbeitet hat, sind Sie möglicherweise auf eine Situation gestoßen, in der Sie ein Array durchlaufen und eine Transformation basierend auf einer Bedingung anwenden müssen. Obwohl einfache Iterationen mit foreach intuitiv erscheinen mögen, führen sie oft zu weniger eleganten Lösungen. In diesem Beitrag werden wir die häufigen Fallstricke bei der Verwendung von foreach mit Bedingungen untersuchen und robuste Alternativen anbieten, die Ihren Code vereinfachen können, ähnlich wie List Comprehensions in Python.

Das Problem mit foreach

Betrachten Sie die folgende foreach Schleife, die Werte in einem Array basierend auf einer Bedingung inkrementiert:

foreach (int x in intArray)
  if (x > 3) // allgemeine Bedingung für x
    x++; 
    // andere Verarbeitung durchführen

Problempunkt

  • Änderungsbeschränkung: Das Hauptproblem hier ist, dass die Inkrementierungsoperation auf x den Inhalt des ursprünglichen Arrays nicht ändert. Infolgedessen erreicht diese Methode nicht den gewünschten Effekt, die Werte in intArray wie erwartet zu aktualisieren.

Verwendung einer traditionellen for Schleife

Um die Inhalte des Arrays effektiv zu ändern, sollten Sie eine traditionelle for Schleife verwenden. Hier ist, wie Sie es umsetzen können:

for(int i = 0; i < intArray.Length; ++i)
{
    if(intArray[i] > 3) 
        ++intArray[i];
}

Vorteile der for Schleife

  • Direkte Änderung: Dieser Ansatz ermöglicht es Ihnen, die Array-Elemente direkt zu ändern, was sicherstellt, dass alle Änderungen sofort innerhalb des Arrays wirksam werden.
  • Flexibilität: Sie können den Index problemlos manipulieren und komplexere Logik nach Bedarf implementieren.

LINQ zur Transformation nutzen

LINQ (Language Integrated Query) kann ebenfalls Lösungen bieten, um durch Arrays zu iterieren, obwohl es mehr darauf ausgelegt ist, neue Sequenzen auf Basis bestehender zu erstellen, als diese vor Ort zu ändern. Hier sind ein paar Beispiele:

Verwendung von LINQ zur Datenumwandlung

Um ein neues transformiertes Array zu erstellen, können Sie LINQ wie folgt anwenden:

var newArray1 = from i in intArray select ((i > 3) ? (i + 1) : (i));
var newArray2 = intArray.Select(i => (i > 3) ? (i + 1) : (i));

Beispiel mit where Klausel

Wenn Sie Elemente unterhalb eines bestimmten Schwellenwerts herausfiltern und ein neues Array erstellen möchten, können Sie Folgendes tun:

var intArray = new int[] { 10, 1, 20, 2 };
var newArray = from i in intArray where i > 3 select i + 1;
// newArray == { 11, 21 }

Zu Beachten

  • Neue Sequenzen erstellen: Denken Sie daran, dass LINQ nicht für die Modifikation bestehender Sammlungen gedacht ist, sondern für die Erstellung neuer Sequenzen basierend auf Transformationen oder Filtern.

Verwendung der ForEach Methode

Für Arrays bietet C# auch die ForEach Methode, die es Ihnen ermöglicht, eine Lambda-Funktion für einfachere Aktionen zu verwenden:

intArray.ForEach(i => DoSomething(i));

Überlegungen

  • Wann man ForEach verwenden sollte: Diese Methode funktioniert gut, um einen Block von Code für jedes Element auszuführen, ist jedoch möglicherweise nicht so vielseitig wie eine foreach oder for Schleife für komplexere Operationen.

Fazit

Zusammenfassend lässt sich sagen, dass die foreach Schleife zwar attraktiv für die Iteration durch Arrays in C# aussieht, die Verwendung einer traditionellen for Schleife bei der direkten Modifizierung von Elementen weitaus praktischer ist. Erforschen Sie LINQ zur Erstellung neuer Sequenzen basierend auf Bedingungen und ziehen Sie in Betracht, die ForEach Methode für vereinfachte Operationen auf Sammlungen zu verwenden. Diese Alternativen helfen Ihnen, sauberen, besser lesbaren und effektiven C#-Code zu schreiben.

Indem Sie die Fähigkeiten und Einschränkungen jedes Konstrukts verstehen, sind Sie besser gerüstet, das richtige Werkzeug für Ihre Programmieraufgaben in Zukunft auszuwählen.