2013-07-16 15 views
10

i bu durumda dize listesini kullanıyorum kod aşağıda verildiği gibi ben dize değerini değiştirmek mümkün duyuyorum, Foreach döngüsündeki nesnelerin değeri mi değiştiriliyor? Bir yerde

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

Ama sınıfın nesne için

i değiştirmek mümkün değilim kod aşağıdaki gibidir nesnenin üyeleri değeri,

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

Hata şudur: çünkü atanamıyor yineleme değişkeni

sen aslında zaten bahsettiğiniz nesneyi değiştirmeyeceğiz
+9

Hayır, önce ön bilgide kod yapmak gerçekten mümkün değil. Yineleme değişkeni salt okunurdur. –

+0

.ToList() nedeniyle listenin kopyasını yaparak ve bu kopyada yinelenen yapabildiğim için çalışıyorum –

+0

Hayır, bunu yapamazsınız. Sadece dene. Kod * derlenmeyecektir *. Eğer gerçekten inandığını düşünüyorsanız, lütfen bunun kısa süreli olduğunu gösteren bir program hazırlayın - bunun başarısız olduğunu göreceksiniz. –

cevap

16

Bir foreach döngüsünün yineleme değişkenini değiştiremezsiniz, ancak yineleme değişkeninin üyelerini değiştirebilirsiniz. Bu nedenle studentDTO başvuru türü olduğu

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

Not ChangeName yöntemini değiştirin. Bu nedenle değişmiş öğrenciyi geri göndermeye gerek yoktur. ChangeName yönteminin ne aldığı, öğrencinin bir kopyası değil, benzersiz öğrenci nesnesine yapılan bir başvurudır. Yineleme değişkeni ve studentDTOList, her ikisi de, aynı öğrenci nesnesine, yöntemin studentDTO parametresi gibi başvurur.

Ve Ancak

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

için döngü değiştirmek ChangeName gibi yöntemler sıradışı. gitmek için yol size söylemek

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

Daha sonra yaptığı yorumda

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

DÜZENLEME

için döngü değiştirebileceğiniz bir özelliğinde alan kapsüllemek olmaktadır birçok alanı değiştirmek zorunda. Bu durumda, tüm değişiklikleri yapacak olan UpdateStudent yöntemine sahip olmak iyi olur; Ancak yine de özelliklerini koruyacağım.

Bir değerden geçmenin yanı sıra özelliklerde ek bir mantık yoksa, bunları otomatik olarak uygulanan kullanışlı özelliklerle değiştirebilirsiniz. Bu durumda name alanını bırakmak zorunda kalırsınız. Bu durumda name alanını terketmeniz gerekir. Bu durumda name alanını terketmeniz gerekir. Bu durumda name alanını bırakmanız gerekir.

+0

için –

+1

yüzden zaten argüman –

+1

Evet referans tipini almak gibi işlevinden şey dönmek yok ... zaten ben sadece söz konusu söylemeyi unutma yapmış ya. Öğrenciyi iade etseniz bile, dönüş değerini güvenli bir şekilde yoksayar ve yinelemeli değişkene atamazsınız. Öğrencinin geri döndürülmesi yöntem çağrılarını zincirlemenize izin verir: 'student.UpdateValues ​​(). StoreChanges(). PrintReport();' –

17

, sana böylece sadece kullanabilirsiniz:

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

Ya hala yöntemini çağırın: Her iki durumda da

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

, kod yineleme değişkeni (student) değerini değiştirmez yüzden sorun yok.

Ancak, orijinal örneğiniz bir şekilde derlenmiyor - bir foreach döngüsüyle tanıtılan yineleme değişkeni salt okunur.

+0

adı özel olacak şu anda +1 her iki şekilde de – Sayse

+0

Aslında kod için bir örnek veriyorum orjinal kodum bu değişkenden çok sayıda değer değiştiriyor ama uçak foreach() ile çalışmıyor, hata gösteriyor. –

+1

@ user2553512: "hatayı gösterir" * asla * yeterli bilgi ... ve nesne içindeki birçok veriyi değiştirmek iyidir, yineleme değişkeninin kendisine yeni bir değer atayamazsınız. Böylece verileri değiştirecek olan ChangeStudent (öğrenci) 'yi çağırabilirsiniz - sadece öğrenci yapamazsınız = ChangeStudent (student) '. i yineleme değişkeni için dönen değer atayarak yapıyorum nasıl nesne ile ikinci döngü bakarsak –