C# 如何避免匿名类型在LINQ中重复?

C# 如何避免匿名类型在LINQ中重复?,c#,linq,C#,Linq,我正在尝试将数据表转换为字符串和整数字典。DataTable有重复项,我编写了以下代码: Dictionary<string, short> data = dt.AsEnumerable() .Select(item => new { Key = item.Field<string>

我正在尝试将
数据表
转换为字符串和整数字典。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
Product2   3
Product4   3

我的代码出错了,因为Distinct()考虑了匿名类型中的所有可用属性。是否有办法实现此linq或覆盖Distinct()的默认行为?

您可以根据文档提供IEqualityComparer到
Distinct()
的实现:


您可以为匿名类型创建这样一个相等比较器,如此堆栈溢出回答中所述:

您可以根据以下文档提供IEqualityComparer到
Distinct()
的实现:

您可以为匿名类型创建这样一个相等比较器,如此堆栈溢出回答中所述:

尝试此方法(按键区分):

Dictionary data=dt.AsEnumerable()
.选择(项目=>新建){
Key=项目字段(“产品名称”),
值=项目字段(“类型id”)
})
.GroupBy(x=>x.Key)
.Select(x=>x.First())
.ToDictionary(dr=>dr.Key,dr=>dr.Value,StringComparer.OrdinalIgnoreCase);
试试这个(按键区分):

Dictionary data=dt.AsEnumerable()
.选择(项目=>新建){
Key=项目字段(“产品名称”),
值=项目字段(“类型id”)
})
.GroupBy(x=>x.Key)
.Select(x=>x.First())
.ToDictionary(dr=>dr.Key,dr=>dr.Value,StringComparer.OrdinalIgnoreCase);

确定它是否不同涉及多少属性?只是钥匙吗?是的,就是钥匙。我需要获得所有不同的产品名称和相应的类型id(这可能是第一个出现的键)。在确定它是否不同时涉及多少属性?只是钥匙吗?是的,就是钥匙。我需要得到所有不同的产品名称和相应的类型id(这可以是第一个出现的密钥)。是的。这也是我要建议的。是的。这也是我要建议的。
Product1   1
Product2   3
Product4   3
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);