En un lugar en el que yo estoy usando la lista de la cadena en ese caso, soy capaz de cambiar el valor de la cadena como el código que se indican a continuación,

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

Pero para un objeto de la clase no soy capaz de alterar los miembros del valor del objeto, el código es el siguiente,

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

De Error es : no se Puede asignar debido a que es la variable de iteración

No, realmente no son capaces de hacer el código en el primer fragmento. La variable de iteración es de sólo lectura.
soy capaz de hacerlo, porque de .ToList() hacer la copia de la lista y la iteración a través de esa copia por lo que es trabajar
No, no eres capaz de hacer eso. Sólo probarlo. El código de no va a compilar. Si usted realmente cree que, por favor, producir un corto pero completo programa demostrando que – vas a ver que falla.
usted puede en bucle modificar el list en el ToList() clon, a continuación, después de que el bucle simplemente assign/set la list a la igualdad de la nueva ToList() producto modificado
sólo una nota al margen, los acrónimos de más de 2 cartas deben utilizar PascalCase. es decir que su clase debe ser llamado StudentDto

OriginalEl autor | 2013-07-16

2 Comentarios

  1. 24

    No se puede cambiar la variable de iteración de un foreach-loop, pero se puede cambiar a los miembros de la variable de iteración. Por lo tanto, cambiar el ChangeName método para

    private void ChangeName(StudentDTO studentDTO)
    {
        studentDTO.name = SomeName;
    }

    Nota que studentDTO es un tipo de referencia. Por lo tanto, no hay necesidad de volver cambiado el estudiante. Lo que el ChangeName método obtiene, no es una copia de la estudiante, pero en una referencia para el único objeto de estudiante. La variable de iteración y la studentDTOList ambos hacen referencia al mismo objeto de estudiante, como lo hace el studentDTO parámetro del método.

    Y cambiar el loop para

    foreach(StudentDTO student in studentDTOList)
    {
        ChangeName(student);
    }

    Sin embargo, los métodos como ChangeName son inusuales. El camino a seguir es encapsular el campo en una propiedad

    private string name;
    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    A continuación, puede cambiar el bucle para

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

    EDITAR

    En un comentario dices que tienes que cambiar en muchos campos. En ese caso sería bueno tener un método UpdateStudent que iba a hacer todos los cambios; sin embargo, yo todavía iba a mantener las propiedades.

    Si no hay ninguna lógica adicional en las propiedades además de pasar a través de un valor, se pueden sustituir por la práctica de la auto-propiedades implementadas.

    public string Name { get; set; }

    En ese caso habría que quitar el campo name.

    ya me han hecho ya, simplemente me olvido mencionar en la pregunta …
    así que no tiene que devolver nada a partir de la función, como ya se hace referencia tipo de argumento
    Sí. Incluso si usted devuelve el estudiante, puede ignorar el valor de retorno y no asignar a la variable de iteración. El regreso del estudiante permite encadenar las llamadas de método: student.UpdateValues().StoreChanges().PrintReport();
    lo conseguí gracias por su ayuda

    OriginalEl autor Olivier Jacot-Descombes

  2. 19

    Usted no está realmente cambiando el objeto que se está refiriendo, de todos modos, lo que se puede usar:

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

    O aún llamar a un método:

    foreach (StudentDTO student in studentDTOList)
    {
        ChangeStudent(student);
    }

    En ambos casos, el código no cambia el valor de la variable de iteración (student) por lo que está bien.

    Pero su ejemplo original no se compila todos modos – una variable de iteración introducido por un foreach bucle es de sólo lectura.

    nombre será privado actualmente pero +1 ya sea de manera
    De hecho me estoy dando un ejemplo de código original de mi código está cambiando muchos de los valores de esa variable, pero con el avión foreach () no funciona se muestra un error .
    muestra el error» es nunca suficiente información… y está bien para cambiar un montón de datos dentro del objeto, simplemente no se puede asignar un nuevo valor a la variable de iteración en sí. Así que usted podría llamar ChangeStudent(student) que iba a cambiar los datos que usted simplemente no puede hacerlo student = ChangeStudent(student).
    Eso es lo que yo estoy haciendo, si usted mira el segundo bucle con el objeto de que es lo que yo estoy haciendo es asignar el valor de retorno para la variable de iteración por lo que es posible mediante el uso de .ToList()
    Sobre todo porque casi nunca hace lo que usted desea. No cambiaría lo que se está iterando sobre, por ejemplo…

    OriginalEl autor Jon Skeet

Dejar respuesta

Please enter your comment!
Please enter your name here