更改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循环的迭代变量,但可以更改迭代变量的成员。因此,将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;
}