c# – 如何通过以下代码调用Equals,GetHashCode和Compare? (神
发布时间:2020-12-16 02:01:16 所属栏目:百科 来源:网络整理
导读:此代码有效,但如何实际调用任何列出的方法.它的工作原理,但似乎它几乎是神奇的,为什么它的工作原理.我从来没有实际调用Equals,GetHashCode或Compare,但代码有效.我也从不在构造函数中为实现两个接口的EmployeeComparer类调用任何东西. 问题:当这个类与新的K
此代码有效,但如何实际调用任何列出的方法.它的工作原理,但似乎它几乎是神奇的,为什么它的工作原理.我从来没有实际调用Equals,GetHashCode或Compare,但代码有效.我也从不在构造函数中为实现两个接口的EmployeeComparer类调用任何东西.
问题:当这个类与新的KeyWord实现时,这是否自动完成? (有些事情似乎不对劲) public class EmployeeComparer : IEqualityComparer<Employee>,IComparer<Employee> 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); } 类: 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,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,它只做了一个新的.它调用的方法是做Compare的方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |