2012-08-04 18 views
11

Wenn ich versuche, dies zu tun ...Wie ändere ich eine Foreach-Iterationsvariable innerhalb der foreach-Schleife?

Item[,] array = new Item[w, h]; // Two dimensional array of class Item, 
           // w, h are unknown at compile time. 
foreach(var item in array) 
{ 
    item = new Item(); 
} 

... ich Cannot assign to 'item' because it is a 'foreach iteration variable'.

Trotzdem möchte ich das tun.

Die Idee ist, Standard-Item Klassenwerte zu bestehenden Artikel zuweisen.

+0

Warum nicht benutzen Sie einfach eine andere Variable? – sczdavos

+0

@ sczdavos wie genau? – user1306322

+0

'var myItem; foreach (var Artikel in twoDimArray) myItem = new Item(); ' – sczdavos

Antwort

18

Okay, jetzt, wo wir Ihr wissen Ziel statt, wie Sie es zu erreichen versuchten, es ist viel einfacher, Beantworten Sie Ihre Frage: Sie sollten keine foreach Schleife verwenden. foreach ist über lesen Elemente aus einer Sammlung - nicht den Inhalt einer Sammlung zu ändern. Es ist eine gute Arbeit, dass der C# -Compiler die Iterationsvariable schreibgeschützt macht, sonst hätte man den Wert der Variablen ändern können, ohne dass die Sammlung geändert wird. (Es müssten mehr wesentliche Änderungen sein Änderungen zu ermöglichen, reflektiert werden ...)

Ich vermute, Sie wollen einfach nur:

for (int i = 0; i < array.GetLength(0); i++) 
{ 
    for (int j = 0; j < array.GetLength(1); j++) 
    { 
     array[i, j] = new Item(); 
    } 
} 

, dass es eine rechteckige Anordnung ist vorausgesetzt (ein Item[,]). Wenn es ein Item[][] ist, dann ist es ein Array von Arrays, und Sie würden, dass etwas anders handhaben - möglicherweise mit einem foreach für die äußere Iteration:

foreach (var subarray in array) 
{ 
    for (int i = 0; i < subarray.Length; i++) 
    { 
     subarray[i] = new Item(); 
    } 
} 
+0

Lässt sehen, ob diese alte Antwort etwas Aufmerksamkeit bekommen wird. Ihre Antwort ist offensichtlich für ein zweidimensionales Array, aber gibt es eine clevere Antwort für ein n-dimensionales Array? – LamdaComplex

+0

@LamdaComplex: Nun, Sie könnten ein Array von Indizes erstellen und effektiv erhöhen - oder Rekursion verwenden. Ich schlage vor, Sie stellen eine neue Frage, mit einem kurzen aber vollständigen Beispiel dessen, was Sie erreichen wollen. –

0

Sie können normale for-Schleife dafür verwenden.

+0

Ich kenne die Dimensionen nicht. – user1306322

+0

es ist ein zweidimensionales Array, so dass Sie * die Länge herausfinden können, oder? – Adam

+0

Dann was als nächstes? – user1306322

5

Nicht die Größe wissen, ist das kein Problem:

for (int i = 0; i < twoDimArray.GetLength(0); i++) 
{ 
    for (int j = 0; j < twoDimArray.GetLength(1); j++) 
    { 
     twoDimArray[i, j] = ... 
    } 
} 
2

Es sieht aus wie Sie das Array zu initialisieren versuchen. Sie können das nicht tun. Stattdessen müssen Sie das Array nach Index durchlaufen.

Um die Elemente eines gegebenen zweidimensionalen Array zu initialisieren, versuchen Sie dies:

for (int d = 0; d < array.GetLength(0); d++) 
{ 
    for (int i = 0; i < array.GetLength(1); i++) 
    { 
     array[d, i] = new Item(); 
    } 
} 
Verwandte Themen