簡體   English   中英

在 foreach 循環中更改對象值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM