从List中删除项目的方法

时间:2010-09-18 16:32:51

标签: c# list

与此相关: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(); }
  }
}

问题方法用“???????”指出和评论字符串。

3 个答案:

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