簡體   English   中英

如何通過以下代碼調用Equals,GetHashCode和Compare? (神秘)

[英]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>

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, 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 (在您的示例中,沒有調用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));
}

Main的角度來看,它從未調用過Compare ,它只做了一個new 它調用的方法是做Compare

Equals(),Compare()和GetHashCode()方法由Dictionary類調用。

問題:當這個類與新的KeyWord實現時,這是否自動完成?

不,當你調用d.Add(...)時就完成了(調用d.Add(...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM