【问题标题】:help with HashTables which contents string arrays in C#帮助在 C# 中包含字符串数组的哈希表
【发布时间】:2011-06-27 11:33:24
【问题描述】:


我有这样的代码。

Hashtable ht = new HashTable();
ht["LSN"] = new string[5]{"MATH","PHIS","CHEM","GEOM","BIO"};
ht["WEEK"] = new string[7]{"MON","TUE","WED","THU","FRI","SAT","SUN"};
ht["GRP"] = new string[5]{"10A","10B","10C","10D","10E"};

现在我想从这个 ht 中获取值,如下所示。

string s = ht["LSN"][0];

但它给出了错误。那么我该如何解决这个问题。

【问题讨论】:

    标签: c# arrays string hashtable


    【解决方案1】:

    我认为您想使用通用类型的字典而不是哈希表:

    Dictionary<String, String[]> ht = new Dictionary<string, string[]>();
    
    ht["LSN"] = new string[5] { "MATH", "PHIS", "CHEM", "GEOM", "BIO" };
    ht["WEEK"] = new string[7] { "MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN" };
    ht["GRP"] = new string[5] { "10A", "10B", "10C", "10D", "10E" };
    
    string s = ht["LSN"][0];
    

    这应该可以正常编译。

    否则,您需要执行强制转换,例如:

    string s = ( ht[ "LSN" ] as string[] )[ 0 ];
    

    【讨论】:

    • +1 表示字典。对于这类问题,这是更好的拟合类型。
    【解决方案2】:

    Hashtable 存储无类型的对象:您需要将读取的值重新转换为字符串数组,例如

    string s = ((string[])ht["LSN"])[0];
    

    string s = (ht["LSN"] as string[])[0];
    

    但是,您最好使用键入的内容,例如Dictionary&lt;&gt; - 然后它就可以工作了:

    Dictionary<string, string[]> ht = new Dictionary<string, string[]>();
    ...
    string s = ht["LSN"][0];
    

    【讨论】:

      【解决方案3】:

      您的ht["LSN"][0] 将返回一个字符串数组。所以你必须添加另一个索引器才能获得正确的值。

      ((string[])ht["LSN"][0])[0]
      

      【讨论】:

        【解决方案4】:

        由于Hashtable 的内容暴露为object,您需要进行转换:

        string s = (ht["LSN"] as string[])[0];
        

        但您可能最好使用Nick 建议的强类型容器。

        【讨论】:

          【解决方案5】:

          HashTable 类的indexer 始终返回object 的实例。您必须将该对象转换为字符串数组:

          string s = ((string[]) ht["LSN"])[0];
          

          也就是说,请考虑改用通用的Dictionary&lt;TKey, TValue&gt; 类。

          【讨论】:

            【解决方案6】:
            string[] aStrings = (string[])ht["LSN"];
            string s = aStrings[0];
            

            【讨论】:

              【解决方案7】:

              你的哈希表是 object 类型的,所以当你尝试访问数组时,你会得到一个错误,因为 object 不支持你正在使用的数组访问器语法。如果您使用字典,如其他答案中所述,您可以使用泛型来定义您使用的是字符串数组而不是对象,这将按您的意愿工作。

              或者,您可以像这样转换变量:

              string[] temp = (string[])ht["LSN"];
              

              这将为您提供所需的临时访问权限。

              【讨论】:

                猜你喜欢
                • 2019-08-08
                • 1970-01-01
                • 2019-07-29
                • 2013-04-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多