通过Dictionary中的key理解object

Object类提供了一些virtual方法,例如ToString, GetHashCode, Equals等,通常我们不太体会它的意义。而Dictionary中的Key却需要也帮助我们很好的理解这些方法。

  • Key满足set属性,即其中的元素不可重复;(应用了Equals方法)
  • Key-Value的映射是通过Key的哈希值来实现的;(应用了GetHashCode方法)

1) string作为key (string虽然是reference type,但这里作为值类型来进行比较是否相等)

            string myKey = "TheUniqueKey";
            string myKey2 = "TheUniqueKey";
            Dictionary<string, object> myDictionary = new Dictionary<string, object>();
            myDictionary.Add(myKey, new Book { Title = "C#" });
            //myDictionary.Add(myKey2, new Book { Title = "VB" });


最后一行会报错,因为myKey与myKey2其实是相等的。

2) Reference type作为key。一种是object没有覆盖Equals方法则以内存地址判断,一种是依赖Equals方法。

    internal class Book
    {
        public string Title { get; set; }

        public override string ToString()
        {
            return Title;
        }
        public override int GetHashCode()
        {
            return Title.GetHashCode();
        }
        //public bool Equals(Book other)
        //{
        //    if (other == null)
        //        return false;

        //    if (this.Title == other.Title)
        //        return true;
        //    else
        //        return false;
        //}

        //public override bool Equals(Object obj)
        //{
        //    if (obj == null)
        //        return false;

        //    Book personObj = obj as Book;
        //    if (personObj == null)
        //        return false;
        //    else
        //        return Equals(personObj);
        //}
    }
  • 第一种情况:假设没有提供Equals方法即注释掉相应的代码  
            Book csharp=new Book{Title="C#"};
            Book vb=new Book{Title="C#"};
            Dictionary<Book, string> dic = new Dictionary<Book, string>();
            dic.Add(csharp, "csharp");
            dic.Add(vb, "vb");

            try
            {
                string book;
                dic.TryGetValue(csharp, out book);
                Console.WriteLine("The book title is {0}.",book);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }


The output is "The book title is csharp."

  • 第二种情况:提供Equals方法

          上述代码会抛出异常,"Unhandled Exception: System.ArgumentException: An item with the same key has already been added."

3) 注释掉GetHashCode方法不影响此例的映射操作。一个问题就是如果没有此方法.NET是如何计算哈希值的?

    第二个问题就是开发人员最好仔细考虑此方法以便提高Dictionary操作的性能。

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值