2012-05-24 4 views
6

Estoy pasando una lista de tipo double [] a una función en una clase, editando los valores dentro de una función utilizando una tempList, y luego devolviendo los valores editados. Pero el originalList que se está pasando también se está editando, y no quiero que se edite para que coincida con la tempList.Problema con la lista de edición <double[]> en C#

Aquí está el código.

List<double[]> newList = new List<double[](); 
newList = myClass.myFunction(value, originalList); 

// myClass 
... 

// myFunction 
public List<double[]> myFunction(int value, List<double[]> myList) 
{ 
    List<double[]> tempList = new List<double[]>(); 
    for (int i = 0; i < myList).Count; i++) 
    { 
     tempList.Add(myList[i]); 
    } 


    // Do stuff to edit tempList 

    return tempList; 
} 
+0

lo que realmente se pregunta, ¿qué es lo que quiere hacer? Puede editar la lista original , no necesita crear una nueva. –

Respuesta

4

tener en cuenta que las matrices son de referencia tipos. Cuando agrega una matriz a tempList, solo se agrega una referencia a la matriz, de modo que myList y tempList se refieren a los mismos objetos double[].

lugar, es necesario hacer un clon de las matrices:

for (int i = 0; i < myList.Count; i++) 
{ 
    tempList.Add((double[])myList[i].Clone()); 
} 
+0

Sí, pero el código parece dudoso en primer lugar. Clonar una matriz rara vez es lo correcto. –

0

El problema que tiene es double[] es un tipo de referencia, no es un tipo de valor, por lo que cuando va a agregar a su tempList, está agregando una referencia al objeto original, no a un objeto nuevo. De hecho, necesita crear un nuevo double[] antes de agregarlo al tempList para que no esté trabajando en el objeto original.

Suponiendo que puede utilizar LINQ, no es necesario realizar un bucle. Puede hacer algo como:

var tempList = myList.Select(x => x.ToArray()).ToList(); 
0

Esto se debe a que los tipos de colecciones/referencias se pasan por referencia. (En realidad, la variable de retención se pasa por valor, pero todas las variables apuntan a la misma referencia).

Para una explicación detallada, lea this SO Answer

Si desea que las modificaciones en mi función no se reflejan en la colección original, tienes que copiar/clonar y luego pasar a myFunction.

Ejemplo

newList = myClass.myFunction(value, (List<double>)originalList.Clone()); 
1

una matriz, here double[], es un tipo de referencia, por lo que la línea de

tempList.Add(myList[i]); 

es la adición de una referencia a la matriz original. Luego, cuando edite tempList, está editando la matriz original. Haga una copia de la siguiente manera:

tempList.Add(myList[i].ToArray()); 
0
tempList.Add(myList[i]); 

significa que se agrega la referencia al objeto de doble [] en el índice i a la lista de temp. por lo tanto, si edita el valor de ese objeto, tendrá la oportunidad en ambas listas.

si usted quiere tener un diferentes listas clonadas que no afecten entre sí, tendrá que hacer lo siguiente:

List<double[]> tempList = new List<double[]>(); 
for (int i = 0; i < myList).Count; i++) 
{ 
    double[] originalListItem = myList[i]; 

    // the most important step here!!! - clone the originalListItem to clonedListItem 

    tempList.Add(clonedListItem); 
} 


// Do stuff to edit tempList 

return tempList; 
1

Está añadiendo la referencia a la matriz a la nueva lista, pero sin hacer una copia del contenido de cada conjunto.Su copia debe verse más o menos así:

foreach (double[] item in myList) 
{ 
    double[] copy = new double[item.Length]; 
    Array.Copy(item, copy); 
    templist.Add(copy); 
} 
0

Está copiando la referencia doble [] a la nueva lista, esta es una copia simple. Necesita una copia profunda y crear nuevas matrices dobles para editar las matrices temporales sin cambiar las matrices originales.

0

Está insertando referencias a la matriz en la tempList, no una copia de la matriz. Entonces, si cambia un valor en la lista temporal, está cambiando la matriz original.

Este código va a funcionar mejor:

for (int i = 0; i < myList.Count; i++) 
    { 
     var copy = new Double[myList[i].Length]; 
     Array.Copy(myList[i], copy, myList[i].Length); 
     tempList.Add(copy); 
    } 
Cuestiones relacionadas