与此相关:Adding new items dynamically to IQueryable hard-coded fake repository
我如何为以下类构建方法,该方法将根据其中一个字段的值从列表中删除项目?
public class FakeProductsRepository
{
private readonly List<Product> fakeProducts = new List<Product>
{
new Product { ProductID = "xxx", Description = "xxx", Price = 1000 },
new Product { ProductID = "yyy", Description = "xxx", Price = 2000 },
new Product { ProductID = "zzz", Description = "xxx", Price = 3000 },
};
public void AddProduct(string productID, string description, int price)
{
fakeProducts.Add(new Product
{
ProductID = productID,
Description = description,
Price = price,
});
}
public void RemoveProduct(string productID)
{
????????
//How to remove the item from the fakeProducts List where ProductID == productID?
}
public IQueryable<Product> Products
{
get { return fakeProducts.AsQueryable(); }
}
}
问题方法用“???????”指出和评论字符串。
答案 0 :(得分:3)
一般来说,对于一个集合,我会使用这段代码:
var productsToRemove = fakeProducts.Where(p => p.ProductID == productID).ToList();
foreach(var product in productsToRemove)
{
fakeProducts.Remove(product);
}
不要忘记ToList()
,或者您可以InvalidOperationException
说“收集已修改”。
更新(感谢linuxuser27):
但List<T>
还有一种特殊的方法,即Predicate<T>
:
fakeProducts.RemoveAll(product => product.ProductID == productID);
答案 1 :(得分:2)
尝试使用LINQ with the where
clause。请注意,您需要.NET 3.5。
var reducedProducts = from r in fakeProducts
where r.ProductID != productID
select r;
这样可以减少收藏。
您还可以使用RemoveAll()
方法,该方法接受谓词但修改当前集合。
fakeProducts.RemoveAll(delegate (Product r) { return r.ProductID != productID; });
答案 2 :(得分:1)
如果按产品ID查找项目是一项常见操作,请考虑使用产品ID键入的字典替换列表。
但是,如果您希望将List作为数据结构,那么只需将其循环(假设只有一个产品具有给定的ProductID):
foreach(Product p in fakeProducts)
{
if(p.ProductId == productID)
{
fakeProducts.remove(p);
break;
}
}