日期:2014-05-17  浏览次数:20894 次

常用算法帖(C#): 字典

    .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
             */
        }

 

接下来我们来看看几个字典类型的小DEMO吧:

Dictionary

        public static void TestDictionary()
        {