在foreach循环中更改对象值?
在一个地方,我正在使用字符串列表,在这种情况下,我能够将字符串的值更改为下面给出的代码,
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()) { studentDTO=ChangeName(studentDTO); //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
这样的方法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
循环引入的迭代变量是只读的。