在复制对象属性时从对象列表中删除项目

时间:2011-07-02 16:06:11

标签: c# linq distinct iequalitycomparer

我是linq和c#的新手,如果我愚蠢的话,请道歉。我有一个查询,根据传入的一些变量,带回产品信息列表,这些产品的价格和这些产品的类别:

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

这样可以正常工作,但是比如说一行y有ID = 1而Cat1 = Foo而另一行有ID = 1而Cat1 = Bar,那么显然上面的查询会带回两个。有没有办法修改此查询,以便我可以为每个ID返回一行。

我用Google搜索了大约2个小时并尝试了分组,。用IEqualityComparer和我找到的其他方法分开但没有成功。我的理解不够好,我会感激任何帮助!

1 个答案:

答案 0 :(得分:1)

你应该通过制作一个HashSet来做到这一点,其中键是你的财产。

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

如果要从原始列表中删除项目,可以从末尾开始使用for循环(不能从for循环中的列表中删除项目)。