程序每次向容器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,說明兩個對象一致,不予以插入。反之,則可插。
