2010-01-12 6 views
5

Tengo una colección ProductSearchResults, debajo del método tiene la intención de encontrar un producto específico en esa colección y actualizarlo. Termino actualizando el objeto que apunta al elemento de la colección en lugar del elemento real en sí (creo)¿Cómo puedo actualizar un elemento en la colección en lugar de la referencia

¿Puede por favor mostrarme cómo hacerlo correctamente para que actualice el producto real en la colección

Gracias

public void UpdateProductInfo(ProductInfo product) 
    { 
     var productToUpdate = this.ProductSearchResults.Where(p => p.ID == product.ID).; 

     if (productUpdate.Count() > 0) 
     { 
      var toUpdate = productToUpdate.First<ProductInfo>(); 

      toUpdate = product; 
     } 
    } 

Respuesta

14

, en realidad, todo lo que está haciendo es cambiar la referencia a la variable local toUpdate a punto en el argumento pasado en product.

permite echar un paso atrás, cuando lo hace:

var toUpdate = productToUpdate.First<ProductInfo>(); 

que tienen una referencia a un elemento de la colección (ProductSearchResults). Ahora puede actualizar felizmente sus propiedades, Ala: sin embargo

toUpdate.ProductName = product.ProductName; 
toUpdate.Price = product.Price; 
//etc.. 

, no se puede actualizar la elementoN en la colección para que apunte a un nuevo elemento diferente/en la forma en que se intenta. Se podría eliminar esa quedará grabado de la colección, y añadir su nueva si eso es precisamente lo que necesita:

public void UpdateProductInfo(ProductInfo product) 
    { 
     var productToUpdate = this.ProductSearchResults.Where(p => p.ID == product.ID).; 

     if (productUpdate.Count() > 0) 
     { 
      var toUpdate = productToUpdate.First<ProductInfo>(); 

      this.ProductSearchResults.Remove(toUpdate); 
      this.ProductSearchResults.Add(product); 
     } 
    } 

Espero que ayude.

+2

Dónde devolverá un IEnumerable cual no han Agregar o quitar métodos. Crear una lista a partir de ella creará una nueva lista para que no funcione. Si ProductSearchResults es una Lista , puede usar Buscar y luego Eliminar y Agregar. –

2
var productToUpdate = this.ProductSearchResults.FirstOrDefault(p => p.ID == product.ID); 

if (productUpdate != null) 
{ 
    productUpdate.Property = product.Property; 
    ...continue for other properties 
} 
0

En C#, escribir variable = expression; asigna un nuevo valor a la variable. No afecta el valor al que se hizo referencia anteriormente por esa variable.

En su ejemplo, tiene un valor llamado product, que es un ProductInfo proporcionada por la persona que llama, y ​​un valor que se obtiene de su lista, que ha almacenado en toUpdate, que desea actualización. Esto implicaría llamar a funciones miembro (o asignar propiedades) de toUpdate según los valores en product.

Sin embargo, sospecho que realmente desea actualizar la información del producto de un producto que se encuentra en una base de datos u otro tipo de almacenamiento al que se accede por ProductSearchResults. El motor de almacenamiento que utiliza (o su capa de acceso a datos) probablemente le proporciona una función para guardar un ProductInfo asociado con un determinado identificador, por lo que todo lo que necesita hacer es llamar a esa función.

0

¿Desea reemplazar el producto en la colección o actualizar algunas propiedades en él? Suponiendo que este último, he aquí un ejemplo:

public void UpdateProductInfo(ProductInfo product) 
{ 
    var productToUpdate = this.ProductSearchResults.FirstOrDefault(p => p.ID == product.ID).; 
    if (productToUpdate == null) 
    { 
     // throw exception? 
    } 
    else 
    { 
     productToUpdate.Price = productInfo.Price; // for example 
    } 
} 
Cuestiones relacionadas