更改我的新列表而不更改原始列表

时间:2018-07-17 19:47:58

标签: c#

这是我的原始列表:

var cart = _workContext.CurrentCustomer.ShoppingCartItems
                        .Where(sci => sci.ShoppingCartType == ShoppingCartType.ShoppingCart)
                        .LimitPerStore(_storeContext.CurrentStore.Id)
                        .ToList();

我查看了此链接:How do I change my new list without changing the original list?

并且已经了解到我有一个复制方法,所以这是我的方法:

private List<ShoppingCartItem> CopyShoppingCartItems(List<ShoppingCartItem> target)
{
    //var tmp = new List<ShoppingCartItem>(target);
    var tmp = target.ToList();
    return tmp;
}

我也测试了var var tmp = new List<shoppingCartItem>(target)。 这是我的目标:

var beforeUpdatCart = CopyShoppingCartItems(cart);
foreach (var sci in cart)
{
    var remove = allIdsToRemove.Contains(sci.Id);
    if (remove)
        _shoppingCartService.DeleteShoppingCartItem(sci, ensureOnlyActiveCheckoutAttributes: true);
    else
    {
        foreach (var formKey in form.Keys)
            if (formKey.Equals($"itemquantity{sci.Id}", StringComparison.InvariantCultureIgnoreCase))
            {
                int newQuantity;
                if (int.TryParse(form[formKey], out newQuantity))
                {
                    sci.Quantity = newQuantity;
                }
                break;
            }
    }
}

但是newQuantity插入了List<shoppingCartItem>的购物车和beforeUpdateCart中。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:3)

因此,您实际上是在更改列表中的项目,而不是将项目插入列表中。当列表引用不同的对象时,它们包含对相同对象的引用。这就是为什么您要同时更新两者的原因。考虑使用deep copy来解决您的问题。这可以通过创建复制构造函数来完成:

public ShoppingCartItem(ShoppingCartItem item)
{
    // copy all your fields there
}

然后:

private List<ShoppingCartItem> CopyShoppingCartItems(List<ShoppingCartItem> target)
{
    var tmp = target.ConvertAll(i => new ShoppingCartItem(i));
    return tmp;
}