C#常用算法:字典2013-11-14.Net(4.0)为我们提供了如下类型的字典结构:Dictionary, SortedDictionary, Lookup。这些类型都支持范型,它们的工作原理基本一致,都是提供如下功能:接收健返回值。它们之间的不同处为:SortedDictionar:有序字典,插入字典的元素都按升序进行了排列。Lookup:一键可以对应多值。在字典的数据结构中,真实充当键的不是当前对象的值。而是对象的hash值,这个值是通过object.GetHashCode()方法返回的。按照不同的对象应该具有不同的hash值原则,我们完全可以通过重载object.GetHashCode方法来设置我们自己的特殊键,我们来看个小例子吧。(根据测试代码的执行结果,我们也能推测出.NET CLR是通过匹配不同对象的Hash值来确定它们是否相等。)
class Person : IEquatable<Person>,IComparer<Person> { public string firstName, lastName; public int age; public Person() { } public Person(string firstName, string lastName, int age) { this.firstName = firstName; this.lastName = lastName; this.age = age; }public bool Equals(Person other) { return other.GetHashCode() == this.GetHashCode(); }public override int GetHashCode() { if (age != null) { return age << 5 * 30; } else { return base.GetHashCode(); } } public int Compare(Person x, Person y) { if (x.age>y.age) { return 1; } else if (x.age == y.age) { return 0; } else { return -1; } } }
public static void TestDictionaryKey(){Person Jeff = new Person("Jeff", "Xiong", 26);Person Jeff2 = Jeff; Console.WriteLine("Jeff"s hash code:{0}", Jeff.GetHashCode());Console.WriteLine("Jeff2"s hash code:{0}", Jeff2.GetHashCode()); if (Jeff.Equals(Jeff2)){Console.WriteLine("Jeff equal Jeff2");}else{Console.WriteLine("Jeff not equal Jeff2");} Person Bob = new Person("Bob", "Li", 26);Console.WriteLine("Bob"s hash code:{0}", Bob.GetHashCode());if (Jeff.Equals(Bob)){Console.WriteLine("Jeff equal Bob");}else{Console.WriteLine("Jeff not equal Bob");} string A = "Jeff";string B = "Jeff";Console.WriteLine("A"s hash code:{0}", A.GetHashCode());Console.WriteLine("B"s hash code:{0}", B.GetHashCode()); double AA = 1.23;double BB = 1.23;Console.WriteLine("AA"s hash code:{0}", AA.GetHashCode());Console.WriteLine("BB"s hash code:{0}", BB.GetHashCode()); /*OUT PUT Jeff"s hash code:109051904 Jeff2"s hash code:109051904 Jeff equal Jeff2 Bob"s hash code:109051904 Jeff equal Bob A"s hash code:808924690 B"s hash code:808924690 AA"s hash code:1158867386 BB"s hash code:1158867386*/}