Kann man mit einer foreach Schleife in C# auch Werte befüllen?

cypher203  27.11.2021, 19:22

Was möchtest du denn genau machen?

RicardoMango 
Fragesteller
 27.11.2021, 19:26

Nichts das ist nur eine generelle Frage. Zum Beispiel möchte ich ein Array das 100 Plätze hat mit zahlen befüllen. Im Prinzip genauso wie bei einer for Schleife.

2 Antworten

Also, nehmen wir mal folgendes Konstrukt:

int[] a = new int[10];
foreach (int e in a) {
  ...
}

Das funktioniert zwar, die Schleife wird 10x aufgerufen, aber wie willst du die nun füllen? In e steht einfach immer eine 0 (oder null? Nicht sicher!). Woher beziehst du also den Index für a zum Befüllen?

Man könnte nun natürlich auf die Idee kommen und ergänzt es mit einer Zählvariable:

int[] a = new int[10];
int i = 0;
foreach (int e in a) {
  a[i] = i;
  i++;
}

Aber welchen Nutzen hat dann e und wieso nicht direkt auf eine for loop zurückgreifen:

int[] a = new int[10];
for (int i=0; i<a.Length; i++) {
    a[i] = i;
}

Macht das gleiche nur schneller und effizienter!

Also nein, foreach loops sind sinnvoll, aber nicht zum Befüllen seiner Container.

Was meinst du mit Werte befüllen?

Wenn du ein Array hast und du über dieses Array iterieren willst und gleichzeitg Werte reinschreiben möchtest solltest du das mit der for Schleife machen. Foreach Schleifen arbeiten dabei eher mit Iteratoren und nicht mit direkter Indizierung wie die For Schleife in diesem Fall.

Bei einigen Containern zB Span ist es aber möglich die foreach Schleife per Referenz laufen zu lassen also:

Span<int> storage = stackalloc int[10];
foreach(ref int val in arr)
   val = 1;

Das würde jetzt alle Einträge mit 1 initialisieren. Allerdings geht das nicht mit allen Iteratoren.

Implizit gilt das aber auch für alle Datentypen die in C# per Referenz übergeben werden. Also es ist zB möglich Methoden in Klasseninstanzen im Iterator aufzurufen, auch wenn diese die Instanz verändern, weil Klassen in C# immer per Referenz übergeben werden, im Gegensatz zu "Plain Value Types" oder Structs.

Nähere dazu findest du hier:

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/statements/iteration-statements