当List.property = myValue时,使用Linq删除列表项

时间:2011-09-05 09:23:40

标签: c# linq

我有以下代码:

List<ProductGroupProductData> productGroupProductDataList = FillMyList();
string[] excludeProductIDs = { "871236", "283462", "897264" };
int count = productGroupProductDataList.Count;

for (int removeItemIndex = 0; removeItemIndex < count; removeItemIndex++)
{
   if (excludeProductIDs.Contains(productGroupProductDataList[removeItemIndex].ProductId))
   {
       productGroupProductDataList.RemoveAt(removeItemIndex);
       count--;
   }
}

现在我想对linq做同样的事情。有什么办法吗?

第二件事是用linq编辑每个List-Item属性。

3 个答案:

答案 0 :(得分:5)

您可以使用RemoveAll

示例:

//create a list of 5 products with ids from 1 to 5
List<Product> products = Enumerable.Range(1,5)
    .Select(c => new Product(c, c.ToString()))
    .ToList(); 
//remove products 1, 2, 3
products.RemoveAll(p => p.id <=3);

其中

// our product class
public sealed class Product {
    public int id {get;private set;}
    public string name {get; private set;}

    public Product(int id, string name)
    {                 
        this.id=id;
        this.name=name;
    }
}

答案 1 :(得分:3)

首先更正当前代码的版本,不会跳过条目

List<ProductGroupProductData> productGroupProductDataList = FillMyList(); 
string[] excludeProductIDs = { "871236", "283462", "897264" }; 
int count = productGroupProductDataList.Count; 

for (int removeItemIndex = 0; removeItemIndex < count; removeItemIndex++) 
{ 
   while (removeItemIndex < count && excludeProductIDs.Contains(productGroupProductDataList[removeItemIndex].ProductId))  {
       productGroupProductDataList.RemoveAt(removeItemIndex); 
       count--; 
     }
   } 
} 

这个linq代码可以完成这项工作。

List<ProductGroupProductData> productGroupProductDataList = FillMyList();  
string[] excludeProductIDs = { "871236", "283462", "897264" };  
productGroupProductDataList=productGroupProductDataList.Where(x=>!excludedProductIDs.Contains(x.ProductId)).ToList();

或者使用paolo的删除所有最后一行的答案将是

productGroupProductDataList.RemoveAll(p=>excludedProductIDs.Contains(p=>p.ProductId));

你的意思是“第二件事就是用linq编辑每个List-Item属性。”?

答案 2 :(得分:0)

根据您的评论,这是一个版本,它创建一个排除元素的集合,而不是从原始列表中删除它们。

var newSet = from p in productGroupProductDataList
                  where !excludeProductIDs.Contains(p.ProductId))
                  select p;

如果你需要(I)列表你可以很容易地得到它,那么newSet的类型是IEnumerable:

   var newList = newSet.ToList();