首页 > 代码库 > C#基础 Dictionary存储自定义对象作为键值
C#基础 Dictionary存储自定义对象作为键值
程序每次向容器Dictionary中插入数据时,都会判断Key值是否已经存在,如果不存在,则插入。否则抛出异常。那么Dictionary又是如何判断Key值是否存在的呢? 请看下面的代码:
class Program
{
static void Main(string[] args)
{
var dic = new Dictionary<Person, int>();
dic.Add(new Person {Name = "ABC", Age = 18}, 1);
dic.Add(new Person { Name = "Captain", Age = 24 }, 1);
dic.Add(new Person { Name = "Knee", Age = 28 }, 1);
dic.Add(new Person { Name = "Knee", Age = 28 }, 2);
foreach (var item in dic)
{
Console.WriteLine(string.Format("{0},{1}", item.Key.Name, item.Key.Age));
}
Console.ReadKey();
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public override bool Equals(object obj)
{
if (!(obj is Person))
{
return false;
}
var p = (Person) obj;
Console.WriteLine(string.Format("Equals{0}", p.Name));
return this.Name == p.Name && this.Age == p.Age;
}
public override int GetHashCode()
{
Console.WriteLine(string.Format("GetHashCode{0}", this.Name));
return Name.GetHashCode() + Age*37;
}
}
从程序运行的结果可以看出,程序每次向Dictionary插入数据的时候,都会调用对象的GetHashCode方法,当得到的值在Dictionary中没有时,就会向Dictionary中插入数据。当第四条数据插入时,程序检测到Dictionary中已经存在了同样的Hash值,它会继续去比较对象的Equals方法,发现对象一致之后,程序抛出异常。
总结:Dictionary插入对象时,会先根据Key的GetHashCode方法来判断是否存在,如果已经存在该HashCode的数据,会继续比较对象的Equals方法,如果Equals方法返回true,说明两个对象一致,不予以插入。反之,则可插。
C#基础 Dictionary存储自定义对象作为键值
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。