2013-07-16 13 views
10

An einer Stelle i in diesem Fall der Liste der Zeichenfolge bin mit dem ich in der Lage bin, den Wert der Zeichenfolge zu ändern, wie Code unten,Objektwert in foreach loop ändern?

foreach(string item in itemlist.ToList()) 
{ 
    item=someValue; //I am able to do this 
} 

Aber für Objekt der Klasse bin ich das nicht in der Lage zu verändern Mitglieder Wert des Objekts den Code wie unten ist,

public class StudentDTO 
{ 
    string name; 
    int rollNo; 
} 

studentDTOList=GetDataFromDatabase(); 

foreach(StudentDTO student in studentDTOList.ToList()) 
{ 
     studentDTO=ChangeName(studentDTO); //Not working 
} 

private StudentDTO ChangeName(StudentDTO studentDTO) 
{ 
    studentDTO.name=SomeName; 
    return studentDTO; 
} 

Fehler ist: Kann nicht zuweisen, da es Iteration Variable

+9

Nein, Sie sind wirklich nicht in der Lage, den Code im ersten Ausschnitt zu tun. Die Iterationsvariable ist schreibgeschützt. –

+0

kann ich tun, weil .ToList() die Kopie der Liste erstellt und diese Kopie durchläuft, damit es funktioniert. –

+0

Nein, das geht nicht. Probier es einfach. Der Code * wird nicht kompiliert *. Wenn Sie wirklich glauben, dass dies der Fall ist, erstellen Sie bitte ein kurzes, aber vollständiges Programm, das zeigt, dass Sie es nicht schaffen. –

Antwort

16

Sie können die Iterationsvariable einer foreach-Schleife nicht ändern, aber Sie können Mitglieder der Iterationsvariablen ändern. Daher ändern die ChangeName Methode

private void ChangeName(StudentDTO studentDTO) 
{ 
    studentDTO.name = SomeName; 
} 

anzumerken, dass studentDTO ein Referenztyp ist. Daher ist es nicht notwendig, den geänderten Schüler zurückzugeben. Was die ChangeName Methode bekommt, ist keine Kopie des Schülers, sondern ein Verweis auf das eindeutige Schülerobjekt. Die Iterationsvariable und die studentDTOList verweisen beide auf dasselbe Schülerobjekt wie der studentDTO Parameter der Methode.

und die Schleife

zu
foreach(StudentDTO student in studentDTOList) 
{ 
    ChangeName(student); 
} 

jedoch wie ChangeName, Methoden ändern sind ungewöhnlich. Der Weg zu gehen, ist das Feld in einer Eigenschaft

private string name; 
public string Name 
{ 
    get { return name; } 
    set { name = value; } 
} 

Sie können einzukapseln dann die Schleife

foreach(StudentDTO student in studentDTOList) 
{ 
    student.Name = SomeName; 
} 
zu

ändern

EDIT

In einem Kommentar sagen Sie, dass Sie muss viele Felder ändern. In diesem Fall wäre es in Ordnung, eine Methode UpdateStudent zu haben, die alle Änderungen vornehmen würde; aber ich würde immer noch die Eigenschaften behalten.

Wenn in den Eigenschaften neben dem Durchlaufen eines Werts keine zusätzliche Logik vorhanden ist, können Sie sie durch die praktischen, automatisch implementierten Eigenschaften ersetzen.

public string Name { get; set; } 

In diesem Fall müssten Sie das Feld name löschen.

+0

ya ich habe das schon gemacht ich vergesse nur, es in der Frage zu erwähnen ... –

+1

also muss ich nichts von der Funktion zurückgeben, da es bereits Referenztyp des Arguments bekommt –

+1

Ja. Selbst wenn Sie den Schüler zurückgeben, können Sie den Rückgabewert ignorieren und ihn nicht der Iterationsvariablen zuweisen. Die Rückkehr des Schülers erlaubt es Ihnen, die Methodenaufrufe zu verketten: 'student.UpdateValues ​​(). StoreChanges(). PrintReport();' –

17

Sie sind nicht wirklich das Objekt zu ändern, die Sie sowieso sich beziehen, so dass Sie kann einfach verwenden:

foreach (StudentDTO student in studentDTOList) 
{ 
    student.name = SomeName; 
} 

Oder rufen Sie noch eine Methode:

foreach (StudentDTO student in studentDTOList) 
{ 
    ChangeStudent(student); 
} 

In beiden Fällen wird der Code nicht den Wert der Iterationsvariable ändern (student), so ist es in Ordnung.

Aber Ihr ursprüngliches Beispiel kompiliert trotzdem nicht - eine Iterationsvariable, die durch eine foreach-Schleife eingeführt wird, ist schreibgeschützt.

+0

name wird privat sein derzeit aber +1 entweder – Sayse

+0

Aktual ich gebe ein Beispiel für Code mein ursprünglichen Code ändert viele Werte von dieser Variable, aber mit Ebene foreach() es funktioniert nicht, es zeigt Fehler. –

+1

@ user2553512: "Es zeigt Fehler" ist * nie * genug Informationen ... und es ist in Ordnung, viele Daten innerhalb des Objekts zu ändern, Sie können der Iterationsvariablen selbst keinen neuen Wert zuweisen. Sie könnten 'ChangeStudent (Student)' nennen, was die Daten ändern würde - Sie können einfach nicht 'student = ChangeStudent (Student)'. –