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

时间:2014-05-16 04:31:28

标签: c# asp.net-mvc c#-4.0

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

2 个答案:

答案 0 :(得分:0)

Distinct在类上使用equals方法,IEquatableIComparable来确定清晰度。

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

两种解决方案:

1)实现自定义IComparator<T>,仅比较元素的colorId

2)在已定义的Equals类上实施GetHashCodeElement,然后在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重复值的数据结构,如列表。如果这不起作用,我会说你需要后退一步,考虑采用不同的方法解决你试图解决的问题。

相关问题