将不同的列表转换为无效的字典

时间:2016-07-11 16:09:36

标签: c# list dictionary

我尝试使用以下代码将对象列表转换为字典:

 var MyDictionary = MyList.Distinct().ToDictionary(i => i.ObjectId, i => i);

我知道字典不应包含重复元素,因此.Distinct()。但是,只要存在重复元素,我仍会得到以下异常:

  

已添加具有相同键的项目。

MyList是MyObject的列表,如下所示:

public class MyObject{

        public string ObjectId { get; set; }

        public string FName { get; set; }

        public string LName { get; set; }

    }

有没有更好的方法从对象列表创建字典?或者我做错了什么?

3 个答案:

答案 0 :(得分:4)

如果要在ObjectId上进行比较,则需要将自定义比较器传递给.Distinct()。你可以这样做:

class MyObjectComparer : IEqualityComparer<MyObject>
{
    public bool Equals(MyObject x, MyObject y)
    {
        return x.ObjectId == y.ObjectId;
    }

    public int GetHashCode(MyObject obj)
    {
        return obj.ObjectId.GetHashCode();
    }
}

var MyDictionary = MyList
    .Distinct(new MyObjectComparer())
    .ToDictionary(i => i.ObjectId, i => i);

答案 1 :(得分:3)

您可以使用分组依据,然后从列表中选择,如下所示:

mktime

答案 2 :(得分:1)

默认情况下,使用EqualsGetHashCode方法中构建的对象可以使用,但您的字典仅适用于ID。您需要将IEqualityComparer传入不同的Id进行比较以测试项目是否相等,或者使MyObject implment EqualsGetHashCode和在Id上进行比较。