加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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的方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读