我尝试使用以下代码将对象列表转换为字典:
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; }
}
有没有更好的方法从对象列表创建字典?或者我做错了什么?
答案 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)
默认情况下,使用Equals
和GetHashCode
方法中构建的对象可以使用,但您的字典仅适用于ID。您需要将IEqualityComparer
传入不同的Id
进行比较以测试项目是否相等,或者使MyObject
implment Equals
和GetHashCode
和在Id
上进行比较。