[英]Changing objects value in foreach loop?
在一個地方,我使用字符串列表,在這種情況下,我能夠按照下面給出的代碼更改字符串的值,
foreach(string item in itemlist.ToList())
{
item = someValue; //I am able to do this
}
但是對於 class 的 object,我無法更改 object 的成員值,代碼如下,
public class StudentDTO
{
string name;
int rollNo;
}
studentDTOList=GetDataFromDatabase();
foreach(StudentDTO student in studentDTOList.ToList())
{
student = ChangeName(student); //Not working
}
private StudentDTO ChangeName(StudentDTO studentDTO)
{
studentDTO.name = SomeName;
return studentDTO;
}
錯誤是:無法分配,因為它是迭代變量
您不能更改 foreach 循環的迭代變量,但可以更改迭代變量的成員。 因此將ChangeName
方法更改為
private void ChangeName(StudentDTO studentDTO)
{
studentDTO.name = SomeName;
}
請注意, studentDTO
是一個引用類型。 因此沒有必要返回改變的學生。 ChangeName
方法得到的不是學生的副本,而是對唯一學生對象的引用。 迭代變量和studentDTOList
都引用同一個學生對象,就像方法的studentDTO
參數一樣。
並將循環更改為
foreach(StudentDTO student in studentDTOList)
{
ChangeName(student);
}
但是,像ChangeName
這樣的方法並不常見。 方法是將字段封裝在屬性中
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
然后,您可以將循環更改為
foreach(StudentDTO student in studentDTOList)
{
student.Name = SomeName;
}
編輯
在評論中,您說您必須更改許多字段。 在這種情況下,可以有一個UpdateStudent
方法來完成所有更改; 但是我仍然會保留這些屬性。
如果屬性中除了傳遞值之外沒有其他邏輯,則可以將它們替換為方便的自動實現的屬性。
public string Name { get; set; }
在這種情況下,您將不得不刪除字段name
。
無論如何,您實際上並沒有更改您所指的對象,因此您可以使用:
foreach (StudentDTO student in studentDTOList)
{
student.name = SomeName;
}
或者仍然調用一個方法:
foreach (StudentDTO student in studentDTOList)
{
ChangeStudent(student);
}
在這兩種情況下,代碼都不會更改迭代變量 ( student
) 的值,所以沒關系。
但是您的原始示例無論如何都無法編譯 - foreach
循環引入的迭代變量是只讀的。
我沒有使用 Foreach,而是使用了 For 循環,這樣我也得到了需要更改的索引,然后我調用了一個 function,在其中我傳遞了要更改的數據以及要更改的索引:
for(int i = 0; i< myList.Count; i++) { if(mylist[i] == otherData) { //call the function ChangeData(otherData, i); } } public void ChangeData(DataType DataToChangeInto, int i) { mylist[i] = DataToChangeInto; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.