Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改foreach循环中的对象值?_C#_Loops_Foreach_Enumeration - Fatal编程技术网

C# 更改foreach循环中的对象值?

C# 更改foreach循环中的对象值?,c#,loops,foreach,enumeration,C#,Loops,Foreach,Enumeration,在一个地方,我使用字符串列表,在这种情况下,我可以更改字符串的值,如下所示的代码 foreach(string item in itemlist.ToList()) { item = someValue; //I am able to do this } 但是对于类的object,我不能改变object的members值,代码如下: public class StudentDTO { string name; int rollNo; } studentDTOList

在一个地方,我使用字符串列表,在这种情况下,我可以更改字符串的值,如下所示的代码

foreach(string item in itemlist.ToList())
{
    item = someValue; //I am able to do this 
}
但是对于类的object,我不能改变object的members值,代码如下:

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 (StudentDTO student in studentDTOList)
{
    student.name = SomeName;
}
或者仍然调用一个方法:

foreach (StudentDTO student in studentDTOList)
{
    ChangeStudent(student);
}
在这两种情况下,代码都不会更改迭代变量(
student
)的值,因此没有问题


但是您的原始示例无论如何都不会编译-由
foreach
循环引入的迭代变量是只读的。

您不能更改foreach循环的迭代变量,但可以更改迭代变量的成员。因此,将
ChangeName
方法更改为

private void ChangeName(StudentDTO studentDTO)
{
    studentDTO.name = SomeName;
}
请注意,
studentDTO
是一种参考类型。因此,无需返回已更改的学生。
ChangeName
方法得到的不是student的副本,而是对唯一student对象的引用。迭代变量和
studentDTOList
都引用与方法的
studentDTO
参数相同的student对象

并将循环更改为

foreach(StudentDTO student in studentDTOList)
{
    ChangeName(student);
}
foreach(StudentDTO student in studentDTOList)
{
    student.Name = SomeName;
}
然而,像
ChangeName
这样的方法并不常见。方法是将字段封装到属性中

private string name;
public string Name
{
    get { return name; }
    set { name = value; }
}
然后可以将循环更改为

foreach(StudentDTO student in studentDTOList)
{
    ChangeName(student);
}
foreach(StudentDTO student in studentDTOList)
{
    student.Name = SomeName;
}

编辑

在评论中,您说您必须更改许多字段。在这种情况下,可以使用一个方法
UpdateStudent
来完成所有更改;但是我仍然会保留这些财产

public string Name { get; set; }
如果属性中除了传递值之外没有其他逻辑,则可以使用方便的自动实现属性替换它们

public string Name { get; set; }

在这种情况下,您必须删除字段
name

不,您确实无法执行第一个代码段中的代码。迭代变量是只读的。我之所以能够这样做,是因为.ToList()创建了列表的副本,并对该副本进行了迭代,所以它可以工作。不,您不能这样做。试试看。代码将不会编译。如果你真的相信它会的话,请编写一个简短但完整的程序来证明它会失败。你可以在循环中修改
ToList()
克隆中的
list
,然后在循环结束后简单地
assign/set
列表以等于新的
ToList()
修改过的产品,大于2个字母的首字母缩略词应使用PascalCase。ie您的类应该被称为StudentDtoname当前将是私有的,但无论哪种方式都是+1。实际上,我正在为代码提供一个示例。我的原始代码正在更改该变量的许多值,但使用plane foreach()它不起作用。它显示错误。@user2553512:“它显示错误”永远都不够信息。。。可以在对象中更改大量数据,但不能为迭代变量本身指定新值。因此,您可以调用
changestudion(student)
,这将更改数据-您不能执行
student=changestudion(student)
@DnshPly9:主要是因为它几乎从来不会执行您希望它执行的操作。它不会改变您正在迭代的内容,例如…@user2553512:我已经在答案中向您展示了,从一开始就可以。因此,我不必从函数返回任何内容,因为它已经获得了参数的引用类型yes。即使返回student,也可以安全地忽略返回值,而不将其分配给迭代变量。返回student允许您链接方法调用:
student.UpdateValues().StoreChanges().PrintReport()