开发者

Removing Items from a list of objects when an object property is duplicated

开发者 https://www.devze.com 2023-03-17 08:14 出处:网络
I am reasonably new to linq and c# so apologies if I am being dumb. I have a query which brings back a list of product info, prices of these products and categories these products are in based on some

I am reasonably new to linq and c# so apologies if I am being dumb. I have a query which brings back a list of product info, prices of these products and categories these products are in based on some variables passed in:

var y = (from pl in dc.Products 
                 join pr in dc.Prices 
                 on pl.ID equals pr.ProductID 
                 join c in dc.Categories
                 on pl.ID equals c.ProductID
                 where pr.Currency == Currency  
                 && (string.IsNullOrEmpty(Cat1) || c.Cat1 == Cat1)
                 && (string.IsNullOrEmpty(Cat2) || c.Cat2 == Cat2)
                 && (string.IsNullOrEmpty(Cat3) || c.Cat3 == Cat3)
                 && (string.IsNullOrEmpty(Cat4) || c.Cat4 == Cat4)
                 && (string.IsNullOrEmpty(Cat5) || c.Cat5 == Cat5)
                 select new {pl,pr,c});

This works fine as far as it goes but say for example a row of y has ID = 1 and Cat1 = Foo and another row has ID = 1 and Cat1 = Bar, then obviously the query above will bring both back. Is there a way to modify this query so that I can bring back just one row for each ID.

I've Googled this for about 开发者_JS百科2 hours and tried group bys, .Distinct with an IEqualityComparer and other methods I found but with no success. My understanding isn't good enough and I'd be grateful for any help!


You should do this by making a HashSet where the key is your property.

List<Product> distinctProducts = new List<Product>();
HashSet<string> dupSet = new HashSet<string>();
foreach (Product p in Product)
{
    if (dupSet.ContainsKey(p.Cat1))
    {
         // do not add
    }
    else
    {
         dupSet.Add(p.Cat1);
         distinctProducts.Add(p);
    }
}

If you want to remove the items from the original list you can use a for loop starting at the end (you can not remove items from a list in a for loop).

0

精彩评论

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