In one place i am using the list of string in that case the i am able to change the value of the string as code given below,
foreach(string item in itemlist.ToList())
{
item=someValue; //I am able to do this
}
But for object of class i am not able to alter the members value of the object the code is as below,
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;
}
Error is : Can not assign because it's iteration variable
You're not actually changing the object that you're referring to anyway, so you can just use:
Or still call a method:
In both cases, the code doesn't change the value of the iteration variable (
student
) so it's okay.But your original example doesn't compile anyway - an iteration variable introduced by a
foreach
loop is read-only.You cannot change the iteration variable of a foreach-loop, but you can change members of the iteration variable. Therefore change the
ChangeName
method toNote that
studentDTO
is a reference type. Therefore there is no need to return the changed student. What theChangeName
method gets, is not a copy of the student but a reference to the unique student object. The iteration variable and thestudentDTOList
both reference the same student object as does thestudentDTO
parameter of the method.And change the loop to
However, methods like
ChangeName
are unusual. The way to go is to encapsulate the field in a propertyYou can then change the loop to
EDIT
In a comment you say that you have to change many fields. In that case it would be okay to have a method
UpdateStudent
that would do all the changes; however I still would keep the properties.If there is no additional logic in the properties besides passing through a value, you can replace them by the handy auto-implemented properties.
In that case you would have to drop the field
name
.