如何在c#中枚举foreach的哈希表

Su *_*lyn 4 c#

我正在尝试枚举一个哈希表,定义为:

private Hashtable keyPairs = new Hashtable();

foreach(SectionPair s in keyPairs)
{
   if(s.Section == incomingSectionNameVariable)
    {
      bExists = true;
      break;
    }
}
// more stuff here
Run Code Online (Sandbox Code Playgroud)

但我从Visual Studio 2013收到错误,"InvalidCastException未处理".尽管使用字典,但我很想知道为什么我会收到此错误.

Wil*_*sem 10

正如您可以在类的" 备注"部分中阅读的那样Hashtable,您枚举的对象是DictionaryEntrys.因此,您必须将其重写为:

foreach(DictionaryEntry s in keyPairs) {
   //Is Section the Key?
   if(s.Key == incomingSectionNameVariable) {
      bExists = true;
      break;
    }
}
Run Code Online (Sandbox Code Playgroud)

A DictionaryEntry有一个KeyValue元素(当然是键和值中的值Hashtable.两者都是Objects,因为a Hashtable不是通用的,因此编译器无法知道Key和/或是什么类型Value.

我建议你却使用Dictionary<TKey,TValue>,因为在这里你可以指定的类型KeyValue.在这种情况下,示例可能如下所示:

private Dictionary<string,int> keyPairs = new Dictionary<string,int>();

foreach( KeyValuePair<string,int> kvp in keyPairs) {
    //do something with kvp
}
Run Code Online (Sandbox Code Playgroud)

但是这kvp.Key将是一个string所以你不必投射它,它使用更安全.