如何避免匿名类型LINQ中的重复?

时间:2016-02-24 22:23:02

标签: c# linq

我正在尝试将DataTable转换为字符串和整数的字典。 DataTable有重复项,我编写了以下代码:

Dictionary<string, short> data = dt.AsEnumerable()
                                   .Select(item => new {
                                                          Key = item.Field<string>("product_name"),
                                                          Value = item.Field<short>("type_id")
                                                        })
                                    .Distinct()
                                    .ToDictionary(dr => dr.Key, dr => dr.Value, StringComparer.OrdinalIgnoreCase);

当我有这样的数据时:

Product1   1
Product1   2
Product2   3
Product4   3

结果应该是这样的:

Product1   1
Product2   3
Product4   3

我的代码错误输出,因为Distinct()会考虑匿名类型中的所有可用属性。有没有办法实现这个linq或覆盖Distinct()的默认行为?

2 个答案:

答案 0 :(得分:4)

试试这个(与Key不同):

Dictionary<string, short> data = dt.AsEnumerable()
                                       .Select(item => new {
                                                              Key = item.Field<string>("product_name"),
                                                              Value = item.Field<short>("type_id")
                                                            })
                                        .GroupBy(x=>x.Key)
                                        .Select(x=>x.First())
                                        .ToDictionary(dr => dr.Key, dr => dr.Value, StringComparer.OrdinalIgnoreCase);

答案 1 :(得分:1)

根据文档,您可以向Distinct()提供IEqualityComparer的实现:https://msdn.microsoft.com/library/bb338049(v=vs.100).aspx

您可以为此匿名类型创建此类相等比较器,如此堆栈溢出答案中所述:https://stackoverflow.com/a/1071637/1675729