2013-07-16 13 views
10

W jednym miejscu używam listy ciąg w tym przypadku jestem w stanie zmienić wartość napisu jak kod podany poniżejZmienianie wartości obiektów w pętli foreach?

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

Ale dla obiektu klasy nie jestem w stanie zmienić członkowie wartość przedmiotu kod jest poniżej,

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; 
} 

błąd jest: nie można przypisać bo to iteracji zmienna

+9

Nie, naprawdę nie jesteś w stanie zrobić kodu w pierwszym fragmencie. Zmienna iteracyjna jest tylko do odczytu. –

+0

Jestem w stanie to zrobić z powodu .ToList() tworzenia kopii listy i iteracji przez tę kopię, więc działa –

+0

Nie, nie jesteś w stanie tego zrobić. Po prostu spróbuj. Kod * nie skompiluje *. Jeśli naprawdę w to uwierzysz, przygotuj krótki, ale kompletny program, pokazujący, że - zobaczysz, że się nie uda. –

Odpowiedz

16

Nie można zmienić zmiennej iteracji pętli foreach, ale można zmienić członków zmiennej iteracji. Dlatego też zmienić metodę ChangeName do

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

Zauważ, że studentDTO jest rodzajem odniesienia. Dlatego nie ma potrzeby zwracania zmienionego ucznia. To, co dostaje metoda ChangeName, nie jest kopią ucznia, ale odniesieniem do unikalnego obiektu ucznia. Zmienna iteracji i studentDTOList odnoszą się do tego samego obiektu ucznia, co parametr studentDTO.

i zmienić pętlę do

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

Jednak sposoby jak ChangeName są niezwykłe. Droga jest do hermetyzacji boiska w nieruchomości

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

Następnie można zmienić pętli

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

EDIT

w komentarzu mówisz, że Muszę zmienić wiele pól. W takim przypadku byłoby dobrze mieć metodę, która wykonałaby wszystkie zmiany; jednak nadal będę zachowywać właściwości.

Jeśli nie ma dodatkowej logiki we właściwościach oprócz przechodzenia przez wartość, można je zastąpić poręcznymi automatycznie zaimplementowanymi właściwościami.

public string Name { get; set; } 

W takim przypadku należy zrzucić pole name.

+0

ya już to zrobiłem, po prostu zapomnij o tym wspomnieć w pytaniu ... –

+1

, więc nie muszę zwracać niczego z funkcji, ponieważ już otrzymuje referencyjny typ argumentu –

+1

Tak. Nawet jeśli zwrócisz ucznia, możesz bezpiecznie zignorować wartość zwracaną i nie przypisać jej do zmiennej iteracyjnej. Zwrócenie studenta pozwala na łańcuch wywołań metod: 'student.UpdateValues ​​(). StoreChanges(). PrintReport();' –

17

nie jesteś rzeczywiście się zmienia obiekt, który masz na myśli tak, tak Ciebie można po prostu użyć:

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

Albo jeszcze wywołać metodę:

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

W obu przypadkach kod nie zmienia wartość zmiennej iteracji (student), więc jest to w porządku.

Ale twój oryginalny przykład i tak się nie kompiluje - zmienna iteracyjna wprowadzona przez pętlę foreach jest tylko do odczytu.

+0

nazwa będzie prywatna obecnie ale +1 w obu kierunkach – Sayse

+0

Rzeczywiście podaję przykład kodu, mój oryginalny kod zmienia wiele wartości z tej zmiennej, ale z foreach płaszczyzny() to nie działa, pokazuje błąd. –

+1

@ user2553512: "pokazuje błąd" jest * nigdy * wystarczającą informacją ... i dobrze jest zmienić wiele danych w obiekcie, po prostu nie można przypisać nowej wartości do samej zmiennej iteracji. Więc możesz nazwać 'ChangeStudent (student)', który zmieniłby dane - po prostu nie możesz zrobić 'student = ChangeStudent (student)'. –