如何通过以下代码调用Equals,GetHashCode和Compare?(神秘)

use*_*862 3 c#

此代码有效,但如何实际调用任何列出的方法.它的工作原理,但似乎它几乎是神奇的,为什么它的工作原理.我从来没有实际调用Equals,GetHashCode或Compare,但代码有效.我也从不在构造函数中为实现两个接口的EmployeeComparer类调用任何东西.

问题:当这个类与新的KeyWord实现时,这是否会自动完成?(有些事情似乎不对劲)

        public class EmployeeComparer : IEqualityComparer<Employee>,
                                        IComparer<Employee>
Run Code Online (Sandbox Code Playgroud)

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);
        }
Run Code Online (Sandbox Code Playgroud)

类:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Tim*_* S. 5

这根本不是魔术.SortedSet<T>的实现调用Compare(在你的例子中,没有任何调用GetHashCodeEquals).就像你执行以下操作一样:

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));
}
Run Code Online (Sandbox Code Playgroud)

Main它的角度来看,它从未打过电话Compare,它只做了一次new.它所采用的方法是做到的方法Compare.