在字典值中选择distinct作为对象

本文关键字:对象 distinct 选择 字典 | 更新日期: 2023-09-27 18:03:43

mainDictionary有所有记录所以我试图在ColorPriceDictionary上获得不同的记录但是我有重复的记录

objProductFrontModel.ColorPriceDictionary =
                    mainDictionary.Select(m => new { m.Value.ColorId, m.Value.ColorText, m.Value.SizeId })
                        .Distinct()
                        .ToDictionary(m => m.ColorId, m => new ProductDetail { ItemText = m.ColorText, ItemId = m.SizeId });

在字典值中选择distinct作为对象

字典中的所有键值必须是不同的,但是您没有选择不同的键值。您选择的是colorID、ColorText和SizeID的不同元组。在这些不同的元组中,显然有一些重复的ColorID值,这就是为什么你会得到一个错误。

我怀疑,如果你从你的选择中删除SizeID,这将成功,因为ColorText似乎明显依赖于SizeID。您的另一种选择是将这些元组选择到一个允许重复的ColorID值的数据结构中,如列表。如果这不起作用,我想说你需要退后一步,考虑一个不同的方法来解决你正在试图解决的问题。

Distinct采用equals法,IEquatable法或IComparable法对类进行区分。

当您说new { m.Value.ColorId, m.Value.ColorText, m.Value.SizeId }时,您正在创建一个具有三个未命名成员变量的匿名(未命名)类。c#编译器为匿名类提供的默认equals实现是比较所有三个成员变量。因此,在Distinct之后,每个结果实例都有三个变量的唯一组合,但不一定只有colorId

两个解决方案:

1)实现一个自定义的IComparator<T>,它只比较元素OR

colorId

2)在定义的Element类上实现EqualsGetHashCode,然后在Select子句中使用。

class MySelectorElement
{
    string ColorId { get; set; }
    string ColorText { get; set; }
    string SizeId { get; set; }
    override bool Equals(object other)
    {
        if (other is MySelectorElement)
        {
            return object.Equals(this.ColorId, ((MySelectorElement)other).ColorId);
        }
        else return false;
    }
    override int GetHashCode()
    {
        return this.ColorId.getHashCode();
    }
}
//...
... Select(new MySelectorElement { ColorId = m.Value.ColorId, ... })
...