2017-02-05 4 views
-4

Erstens weiß ich, dass ich keine foreach-Schleife in C# verwenden kann, um Werte hinzuzufügen, sagen wir mal ein Array ... Aber warum? Warum zum Beispiel kann ich nicht tue diesC# foreach-Schleife kann keine Literale in einem Array hinzufügen

int[] numbers = { 1, 4, 3, 5, 7, 9 }; 
foreach (int item in numbers) 
{ 
    numbers[item] = 2; 
} 

es etwas Hat mit der tatsächlichen Realisierung der foreach-Schleife in dem Back-End zu tun? Und wie funktioniert die foreach loop genau? Ich weiß, dass es durch die ganze Sammlung geht (Array) aber wie genau?

+2

Was genau erwarten Sie von diesem Vorgang? Es wird fehlschlagen, weil Sie versuchen, auf Index 7 und 9 eines Arrays zuzugreifen, das nur 6 lang ist. * Array-Größen sind in C# festgelegt. * – DavidG

+1

Sie können keine Elemente zu einem Array hinzufügen, unabhängig vom verwendeten Loop-Typ. –

+0

@ SelmanGenç natürlich kann ich ... 'int [] Zahlen = {1, 4, 3, 5, 7, 9}; für (int i = 0; i john

Antwort

3

Ich bin bei dieser Suche:

numbers[item] = 2; 

In diesem Ausdruck sind Sie die item Variable wie ein Index verwenden, als ob es hatte die Werte 1, 2, 3, 4 usw. Das ist nicht wie die foreach i Laufzeitvariable funktioniert für C#. Die einzige Sprache, die ich kenne, ist Javascript.

Denken Sie daran, dass foreach und for nicht dasselbe sind. So gut wie jede andere Sprache, einschließlich C#, gibt Ihnen die tatsächlichen Array-Werte in der item Größe eines foreach Schleife: 1, 4, 3, 5 etc. Nun sind diese ganzen Zahlen, so dass Sie könnte versuchen, sie als Indizes zu verwenden, . Sie können die Schleife so lange ausführen ... bis Sie den Wert 7 erreichen. Zu diesem Zeitpunkt hat Ihr Array nur sechs Werte. Sie versuchen, dies zu tun:

numbers[7] = 2; 

für ein Array, in dem der größte gültigen Index Sie 5 ist verwenden können.

Dies gilt auch, wenn Sie Ihre Modifizierung des Arrays berücksichtigen. Lassen Sie sich nach jeder Iteration durch die Schleife am Array aussehen:

{ 1, 4, 3, 5, 7, 9 } //initial state 
{ 1, 2, 3, 5, 7, 9 } // after 1st iteration (index 0). Value at index 0 is 1, so item as index 1 is set to 2 
{ 1, 2, 2, 5, 7, 9 } // after 2nd iteration (index 1). Value at index 1 is now 2, so item at index 2 is set to 2 
{ 1, 2, 2, 5, 7, 9 } // after 3rd iteration (index 2). Value at index 2 is now 2, so item at index 2 is set to 2 
{ 1, 2, 2, 5, 7, 2 } // after 4th iteration (index 3). Value at index 3 is 5, so item at index 5 is set to 2 
// The 5th iteration (index 4). Value at index 4 is 7, which is beyond the end of the array 

Für die warum diese ... es klingt wie Sie zu einer dynamischeren Sprache gewohnt sind. Einige dieser anderen Sprachen, wie PHP oder Javascript, haben keine echten Arrays überhaupt im reinen Informatik-Sinn. Stattdessen haben sie Sammlung Typen, die sie Anruf ein Array, aber wenn Sie sich darauf konzentrieren, sind wirklich etwas anderes.

C# hat echte Arrays, und echte Arrays haben eine feste Größe. Wenn das, was Sie wirklich wollen, eine Sammlung ist, hat C# Sammlungen auch. Sie können beispielsweise List<T> Objekte verwenden, um eine Array-ähnliche Sammlung zu erhalten, an die Sie leicht anhängen können.

Für die anderen Sprachen variieren die Ergebnisse je nachdem, was Sie sprechen, aber für die meisten permissive das Ergebnis Ihrer fünften Iteration ist so etwas wie folgt aus:

{ 1, 2, 2, 5, 7, 2, ,2 } 

Notieren Sie sich den fehlenden Wert bei Index 6. Diese Art von Dingen führt zu Fehlern, die durch Ihre Tests schlüpfen und erst zur Laufzeit auftauchen. Sie müssen sich auch fragen, wie dicht oder spärlich das Array gefüllt wird, da die beste Strategie für die Handhabung dieser Arrays je nach Ihrer Antwort sehr unterschiedlich sein kann ... alles nur von einem großen Backing-Array mit leeren Knoten, die der Programmierer hat kenne den ganzen Weg zu Hashtables und Dictionaries. Und übrigens, C# hat diese Optionen wieder für Sie verfügbar.

+0

ok, aber '{1, 2, 3, 5, 7, 9} // nach 1. Iteration. Index bei 1. Wert (1) auf 2 gesetzt Warum beginnt es beim Index 1, warum nicht Index 0? – john

+0

Ich sprach sequenziell, anstatt nach Index. Der erste Wert im Array befindet sich an der Position "0" und hat den Wert "1". Nach der ersten Iteration wird das Element an der Indexposition "1" so eingestellt, dass es einen Wert von "2" aufweist. Ich werde versuchen zu klären. –

+0

Auch mir fehlte ein Schritt, aber es ist jetzt richtig. –

-1

Sie benötigen Zähler zu erstellen, in anderem Fall, dass Sie Artikel außerhalb des Arrays zuzugreifen versuchen

int[] numbers = new int[]{ 1, 4, 3, 5, 7, 9 }; 
int i = 0; 
foreach (int item in numbers) 
{ 
    numbers[i] = 2; 
    i++; 
} 

// Print the items of the array 
foreach (int item in numbers) 
{ 
    Console.WriteLine(item); 
} 
+0

Ja, das ist meine Frage ... Warum greife ich auf Objekte außerhalb des Arrays?Muss es etwas mit der Implementierung der foreach-Schleife tun? – john

+0

@john: Welche konkrete Operation meinen Sie mit "Zugriff auf ein Element außerhalb des Arrays", wo Ihnen nicht klar ist, dass Sie einen Index außerhalb des Bereichs gültiger Indizes für das Array verwenden? Ihr Array hat eine Länge von 6, daher müssen Ihre Array-Indizes zwischen 0 und 5 liegen (beide inklusive), um "innerhalb" des Arrays zu liegen. –

+0

Nun, wenn ich das tue 'int [] numbers = {1, 4, 3, 5, 7, 9}; foreach (int Artikel in Zahlen) { Nummern [item] = 2; } 'Ich bekomme eine IndexOutOfRangeException – john

3

Sie zu step through your code in a debugger benötigen.

Eine for Aussage ist eher wie eine while Aussage, nicht wie eine foreach.

Die Linie int[] numbers = { 1, 4, 3, 5, 7, 9 }; diese erstellen:

numbers[0] = 1; 
numbers[1] = 4; 
numbers[2] = 3; 
numbers[3] = 5; 
numbers[4] = 7; 
numbers[5] = 9; 

Ihre foreach Aussage tut dies:

numbers[1] = 2; 
numbers[4] = 2; 
numbers[3] = 2; 
numbers[5] = 2; 
numbers[7] = 2; <- this line overflows your array! 
numbers[9] = 2; <- and so would this. 

Sie haben den Unterschied zwischen einem Array-Index und einem Array Wert zu lernen.

+0

Ich weiß "der Unterschied zwischen einem Array-Index und einem Array-Wert" lol ... nur don weiß nicht, wie die foreach-Schleife in der Implementierung genau funktioniert – john

+0

@john Es wurde mehrfach demonstriert. Dies entspricht einer for-Schleife, in der Sie den aktuellen Wert speichern. 'für (int i = 0; i Moira

+0

Der' numbers [9] '-Teil ist eigentlich kein Problem, da der Wert dort auf' 2' geändert wird, bevor der Code ausgeführt wird. Aber die '7' explodiert immer noch. –

4

Sie sind in dem Wert eines Elements Passing (Ihre Variable, item, wird an jeder Position in der Sequenz der Wert des Arrays sein, nicht der Index) in dem Array als Index. Der dort verwendete Index ist die Position des Elements, auf das Sie zugreifen möchten, nicht der Wert. So wird jede Iteration der Schleife Sie anrufen:

  • numbers[1]
  • numbers[4]
  • numbers[3]
  • numbers[5]
  • numbers[7]
  • numbers[9]

Das Array hat 6 Zahlen. Wenn Sie also zu numbers[7] gelangen, fragen Sie nach einem Wert, der nicht vorhanden ist, daher die Ausnahme.

for(int i = 0; i < numbers.Length; i++) 
{ 
    numbers[i] = 2; 
} 

Bei jeder Iteration dieser Schleife würden Sie Zugriff auf: zu tun wäre,

Eine bessere Methode zu tun, was Sie versuchen,

  • numbers[0]
  • numbers[1]
  • numbers[2]
  • numbers[3]
  • numbers[4]
  • numbers[5]
Verwandte Themen