更改foreach循环中的对象值

本文关键字:对象 foreach 循环 更改 | 更新日期: 2023-09-27 18:22:27

在一个地方,我使用字符串列表,在这种情况下,我可以将字符串的值更改为下面给出的代码,

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

但对于类的对象,我无法更改对象的成员值,代码如下,

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循环中的对象值

不能更改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循环,这样我还可以获得需要更改的索引,然后我调用一个函数,在该函数中我传递要更改的数据以及要更改的索引:

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