我有这个代码:
class MyObj {
int Id;
string Name;
string Location;
}
IEnumerable<MyObj> list;
我想将列表转换为字典,如下所示:
list.ToDictionary(x => x.Name);
但它告诉我我有重复的钥匙。如何只保留每个键的第一项?
我想最简单的方法是按键分组并获取每组的第一个元素:
list.GroupBy(x => x.name).Select(g => g.First()).ToDictionary(x => x.name);
或者你可以使用Distinct
如果你的对象实现IEquatable
通过键进行比较:
// I'll just randomly call your object Person for this example.
class Person : IEquatable<Person>
{
public string Name { get; set; }
public bool Equals(Person other)
{
if (other == null)
return false;
return Name == other.Name;
}
public override bool Equals(object obj)
{
return base.Equals(obj as Person);
}
public override int GetHashCode()
{
return Name.GetHashCode();
}
}
...
list.Distinct().ToDictionary(x => x.Name);
或者,如果您不想这样做(也许是因为您通常想以不同的方式比较相等性,所以Equals
已经在使用中)你可以自定义实现IEqualityComparer
仅针对这种情况:
class PersonComparer : IEqualityComparer<Person>
{
public bool Equals(Person x, Person y)
{
if (x == null)
return y == null;
if (y == null)
return false;
return x.Name == y.Name;
}
public int GetHashCode(Person obj)
{
return obj.Name.GetHashCode();
}
}
...
list.Distinct(new PersonComparer()).ToDictionary(x => x.Name);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)