我尝试在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");
}
}
答案 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。