在字典值中选择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 });
字典中的所有键值必须是不同的,但是您没有选择不同的键值。您选择的是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
类上实现Equals
和GetHashCode
,然后在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, ... })
...