程序每次向容器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,说明两个对象一致,不予以插入。反之,则可插。