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

本文关键字:LINQ 类型 何避免 | 更新日期: 2023-09-27 18:36:02

我正在尝试将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() 的默认行为?

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

试试这个(按键区分):

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

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

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