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 });
答案 0 :(得分:0)
Distinct
在类上使用equals
方法,IEquatable
或IComparable
来确定清晰度。
当您说new { m.Value.ColorId, m.Value.ColorText, m.Value.SizeId }
时,您正在创建一个包含三个未命名成员变量的匿名(未命名)类。 C#编译器为匿名类提供的默认equals
实现是比较所有三个成员变量。因此,在Distinct
之后,每个结果实例都具有三个变量的唯一组合,但不一定只是colorId
。
两种解决方案:
1)实现自定义IComparator<T>
,仅比较元素的colorId
或
2)在已定义的Equals
类上实施GetHashCode
和Element
,然后在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, ... })
...
答案 1 :(得分:0)
字典中的所有键值必须是不同的,但您不能选择不同的键值。您正在选择colorID,ColorText和SizeID的不同元组。在这些不同的元组中,ColorID有一些重复的值,这就是你收到错误的原因。
我怀疑如果从选择中删除SizeID,这将成功,因为ColorText似乎显然依赖于SizeID。您的另一个选择是将这些元组选择为容忍ColorID重复值的数据结构,如列表。如果这不起作用,我会说你需要后退一步,考虑采用不同的方法解决你试图解决的问题。