此代码有效,但如何实际调用任何列出的方法.它的工作原理,但似乎它几乎是神奇的,为什么它的工作原理.我从来没有实际调用Equals,GetHashCode或Compare,但代码有效.我也从不在构造函数中为实现两个接口的EmployeeComparer类调用任何东西.
问题:当这个类与新的KeyWord实现时,这是否会自动完成?(有些事情似乎不对劲)
public class EmployeeComparer : IEqualityComparer<Employee>,
IComparer<Employee>
Run Code Online (Sandbox Code Playgroud)
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)
这根本不是魔术.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));
}
Run Code Online (Sandbox Code Playgroud)
从Main它的角度来看,它从未打过电话Compare,它只做了一次new.它所采用的方法是做到的方法Compare.