![](/img/trans.png)
[英]IEqualityComparer GetHashCode being called but Equals not
[英]How is the Equals, GetHashCode, and Compare called from the following code? (Mystery)
此代碼有效,但如何實際調用任何列出的方法。 它的工作原理,但似乎它幾乎是神奇的,為什么它的工作原理。 我從來沒有實際調用Equals,GetHashCode或Compare,但代碼有效。 我也從不在構造函數中為實現兩個接口的EmployeeComparer類調用任何東西。
問題:當這個類與新的KeyWord實現時,這是否自動完成? (有些事情似乎不對勁)
public class EmployeeComparer : IEqualityComparer<Employee>,
IComparer<Employee>
public bool Equals(Employee x, Employee y)
{
return String.Equals(x.Name, y.Name);
}
public int GetHashCode(Employee obj)
{
return obj.Name.GetHashCode();
}
public int Compare(Employee x, Employee y)
{
return String.Compare(x.Name, y.Name);
}
類:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
public delegate void Del(string e);
Del handler = DelegateMethod;
Dictionary<string, List<Employee>> d = new Dictionary<string,
List<Employee>>();
public static void DelegateMethod(string message)
{
System.Console.WriteLine(message);
System.Console.ReadKey();
}
public void testDel(Del d)
{
d.Invoke("L");
}
static void Main(string[] args)
{
Program p = new Program();
//p.handler("Hello World");
//p.handler("DisneyLand");
//p.handler("Cattle Wars");
//p.testDel(p.handler);
var d = new SortedDictionary<string, SortedSet<Employee>>();
//Hashset no duplicates
d.Add("AA", new SortedSet<Employee>(new EmployeeComparer()));
d["AA"].Add(new Employee { Name = "A" });
d["AA"].Add(new Employee { Name = "B"} );
d["AA"].Add(new Employee { Name = "C"} );
d["AA"].Add(new Employee { Name = "C" });
d["AA"].Add(new Employee { Name = "C" });
d.Add("BB", new SortedSet<Employee>(new EmployeeComparer()));
d["BB"].Add(new Employee { Name = "E"} );
d["BB"].Add(new Employee { Name = "F"} );
d["BB"].Add(new Employee { Name = "A"} );
d.Add("CC", new SortedSet<Employee>(new EmployeeComparer()));
d["CC"].Add(new Employee { Name = "Z"} );
d["CC"].Add(new Employee { Name = "X"} );
d["CC"].Add(new Employee { Name = "Y"} );
d.Add("DD", new SortedSet<Employee>(new EmployeeComparer()));
d["DD"].Add(new Employee { Name = "Z" });
d["DD"].Add(new Employee { Name = "U" });
d["DD"].Add(new Employee { Name = "U" });
d["DD"].Add(new Employee { Name = "Q" });
d["DD"].Add(new Employee { Name = "Y" });
foreach (var a in d)
{
Console.WriteLine(a.Key);
foreach (var e in a.Value)
{
Console.WriteLine("\t" + e.Name);
}
}
Console.ReadKey();
}
}
public class EmployeeComparer : IEqualityComparer<Employee>,
IComparer<Employee>
{
public EmployeeComparer() { }
public bool Equals(Employee x, Employee y)
{
return String.Equals(x.Name, y.Name);
}
public int GetHashCode(Employee obj)
{
return obj.Name.GetHashCode();
}
public int Compare(Employee x, Employee y)
{
return String.Compare(x.Name, y.Name);
}
}
}
這根本不是魔術。 SortedSet<T>
的實現調用Compare
(在您的示例中,沒有調用GetHashCode
或Equals
)。 就像你執行以下操作一樣:
void Main()
{
MyMethod(new EmployeeComparer());
}
void MyMethod(IComparer<Employee> comparer)
{
var emp1 = new Employee { Name = "George" };
var emp2 = new Employee { Name = "Tom" };
Console.WriteLine(comparer.Compare(emp1, emp2));
}
從Main
的角度來看,它從未調用過Compare
,它只做了一個new
。 它調用的方法是做Compare
。
Equals(),Compare()和GetHashCode()方法由Dictionary類調用。
問題:當這個類與新的KeyWord實現時,這是否自動完成?
不,當你調用d.Add(...)
時就完成了(調用d.Add(...)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.