无法从列表中删除项目

时间:2017-12-02 11:22:12

标签: c# asp.net-mvc

我尝试在DeleteProduct方法中删除产品中的项目,并且Remove方法返回true但所有项目仍在列表中,我无法弄清楚原因。

正如我所说的那样,产品列表在应用程序的第一次启动时创建,而在静态构造函数中,它会填充项目。然后在DeleteProduct方法中,其中一个项删除并执行Products Method。

请有人解释一下!

public class ProductController
    : Controller
{
    private static IEnumerable<ProductViewModel> products = null;

    static ProductController()
    {
        products = new List<ProductViewModel>
        {
            new ProductViewModel{Id = 0, Description = "Milk", Price = 21.0, IsAvailable = true, LastUpdate = DateTime.Now},
            new ProductViewModel{Id = 1, Description = "Bread", Price = 10.10, IsAvailable = false, LastUpdate = DateTime.Now},
            new ProductViewModel{Id = 2, Description = "Soure creame", Price = 34.5, IsAvailable = true, LastUpdate = DateTime.Now},
            new ProductViewModel{Id = 3, Description = "Chocolate", Price = 31.0, IsAvailable = true, LastUpdate = DateTime.Now},
            new ProductViewModel{Id = 4, Description = "Apples", Price = 1.0, IsAvailable = true, LastUpdate = DateTime.Now},
        };
    }
    public ActionResult Products()
    {
        return View(products);
    }

    public ActionResult DeleteProduct(int id)
    {
        var product = products.FirstOrDefault(p => p.Id == id);

        if (product != null)
            products.ToList().Remove(product);

        return RedirectToAction("Products");
    }
}

3 个答案:

答案 0 :(得分:2)

问题出在那一行:

products.ToList().Remove(product);

通过调用ToList()生成新列表并从新创建的列表中删除产品。要使代码生效,请将产品字段更改为键入List

private static List<ProductViewModel> products = null;

这样,您可以使用列表的方法,而不必强制转换或使用ToList()。您可以直接在产品字段上致电Remove

products.Remove(product);

答案 1 :(得分:1)

执行products.ToList()时,您正在创建新列表。因此,当您执行products.ToList().Remove(product)时,您将从此新列表中删除该产品。

您可以执行以下操作:

if (product != null)
{
    List<ProductViewModel> productList = products.ToList();
    productList.Remove(product);
    products = productList;
}

或者,您可以更改以便静态变量products的类型为List<ProductViewModel>,因此您不必创建新实例。

答案 2 :(得分:0)

考虑更换:

var product = products.FirstOrDefault(p => p.Id == id);

if (product != null)
    products.ToList().Remove(product);

使用:

products.Remove(product);

并替换:

private static IEnumerable<ProductViewModel> products = null;

使用:

private static List<ProductViewModel> products = null;

ToList是不必要的,因为它会创建 List并从 {{1}中移除product (这基本上没有意义)。

List是不必要的,因为FirstOrDefault会处理只有在您已经存在问题时才删除此项目。 代码基本上是检查两次该项目是否存在,然后再删除它。

Remove将其作为“原始”类型(IEnumerable)没有任何好处,并且使用List无法调用IEnumerable

还考虑使用Remove而不是ConcurrentBag - thread safety