就是键abc与ABC被认为是同一个键

解决方案 »

  1.   

    重写 Object.GetHashCode 方法(或 IHashCodeProvider 接口)和 Object.Equals 方法(或 IComparer 接口),
      

  2.   

    new Hashtable(System.StringComparer.Create(System.Globalization.CultureInfo.CurrentCulture, true))
      

  3.   

    添加键的时候,把键转换为小写(或大写),如has1.add(s.ToLower(),obj),
    取数据的时候,同样也把键转换为小写,如has1[s.ToLower()],这样就能达到忽略大小写的目的了。
      

  4.   

     忽略的方法可以是是,你在加入hashtable的时候和比较的时候,将字符串都转化为大写或者小写。   
     eg: hashTable.Add(key.ToLower(),   data);   
        
      hashTable[key.ToLower()]
      

  5.   

    abc和ABC的HashCode值是不一样的,用GetHashCode()方法可以得知重写HashTable的Add方法和Clear方法,根据键的HashCode不同插入键
      

  6.   

    忘了说了,这个类是要提供给其他用户用的,用户是不知道要将键转换成全大写或全小写的,比如他如下用:
    table.Add( "Abc", "111" );
    table.Add( "abC", "222" );
    这时候表里应该只有一对键值,当他取值的时候:
    table["abc"]
    table["aBc"]
    table["ABC"]
    等都应该可以取到222这个串我是C#菜鸟,哪位大侠能写一个完整的类吗
      

  7.   

    自己写个取值的函数提供给他用就可以了呀。添加的时候先把键转换为小写,同前,然后把以下接口提供给客户使用。
    public object GetValue(string Key)
    {
       return table[Key.ToLower()]
    }
      

  8.   

    但是你无法禁止用户用table[key]去取值或设置值,还是会出错的
      

  9.   

    再写一遍:
    new Hashtable(System.StringComparer.Create(System.Globalization.CultureInfo.CurrentCulture, true))
      

  10.   

    vwxyzh:
    我是要实现一个自己的hashtable类提供给我的用户去调用API,不是让用户写你提供的方法去new一个出来,请问我自己的类怎么达到你写的这种功能
    我这样写可是编译不过:public class MyHash:Hashtable
    {
        public MyHash() {
            base(System.StringComparer.Create(System.Globalization.CultureInfo.CurrentCulture, true));
      }
    }说是在此上下文中使用base无效,看来与java不一样啊
      

  11.   

    c#里面是这么写的:
    public MyHash()
      : base(System.StringComparer.Create(System.Globalization.CultureInfo.CurrentCulture, true))
    {
    }