开发者

remove list-items with Linq when List.property = myValue

I have the following code:

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

for (int removeItemIndex = 0; removeItemIndex < count; removeItemIndex++)
{
   if (excludeProductIDs.Contains(productGroupP开发者_如何学GoroductDataList[removeItemIndex].ProductId))
   {
       productGroupProductDataList.RemoveAt(removeItemIndex);
       count--;
   }
}

Now i want to do the same with linq. Is there any way for this?

The second thing would be, to edit each List-Item property with linq.


you could use RemoveAll.

Example:

//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);

where

// 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;
    }
}


Firstly corrected version of your current code that won't skip entries

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

This linq code would do the job.

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

Alternatively using paolo's answer of remove all the last line would be would be

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

What you mean by "The second thing would be, to edit each List-Item property with linq."?


As per your comment here's a version that creates a set that excludes the elements rather than removing them from the original list.

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

The type of newSet is IEnumerable if you need (I)List you can easily get that:

   var newList = newSet.ToList();
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜