1

我对 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 带回一行。

我已经用谷歌搜索了大约 2 个小时,并尝试了 group bys、.Distinct 与 IEqualityComparer 以及我找到的其他方法,但没有成功。我的理解还不够好,如果有任何帮助,我将不胜感激!

4

1 回答 1

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 循环中的列表中删除项目)。

于 2011-07-02T16:13:33.397 回答