如何更新集合中的元素而不是引用

时间:2010-01-12 13:56:35

标签: c#

我有一个ProductSearchResults集合,下面的方法打算在该集合中查找特定产品并进行更新。我最终更新了指向集合元素的对象而不是它自己的实际元素(我认为)

您能否告诉我如何正确执行此操作,以便更新集合中的实际产品

由于

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

4 个答案:

答案 0 :(得分:16)

实际上,您所做的只是更改对局部变量toUpdate的引用,以指向传入的参数product

当你这样做时,让我们退一步:

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

您的收藏品(ProductSearchResults)中有一个参考。您现在可以愉快地更新其属性,ala:

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

但是,您无法更新集合中的itemn以指向您尝试的方式中的其他/新项目。您可以从集合中删除该itme,如果确实如此,则添加新的itme:

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

希望有所帮助。

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

在C#中,写variable = expression;为变量赋予一个新值。它不会影响该变量先前引用的值。

在您的示例中,您有一个名为product的值,即调用者提供的ProductInfo,以及您从列表中获取的值,该值存储在toUpdate中,您希望更新。这将涉及根据toUpdate中的值调用product的成员函数(或指定属性)。

但是,我怀疑您确实想要更新数据库中找到的产品的产品信息或ProductSearchResults访问的其他类型的存储。您使用的存储引擎(或您的数据访问层)可能为您提供了保存与某个标识符关联的ProductInfo的功能,因此您需要做的就是调用该功能。

答案 3 :(得分:0)

是否要更换集合中的产品或更新其中的某些属性?假设后者,这是一个例子:

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