помочь с HashTables, которые содержат строковые массивы в C # - PullRequest
8 голосов
/ 15 февраля 2011


У меня есть такой код.

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];

но выдает ошибку.Итак, как я могу решить эту проблему.

Ответы [ 7 ]

9 голосов
/ 15 февраля 2011

Я думаю, что вы хотите использовать общий типизированный словарь, а не Hashtable:

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 ];
2 голосов
/ 15 февраля 2011

Ваша хеш-таблица относится к типу object, поэтому при попытке доступа к массиву вы получите сообщение об ошибке, поскольку объект не поддерживает используемый вами синтаксис доступа к массиву. если вы использовали словарь, как объяснялось в других ответах, вы могли бы использовать обобщенные значения, чтобы определить, что вы используете строковые массивы, а не объекты, которые будут работать, как вы хотите.

альтернативно, вы можете привести ваши переменные следующим образом:

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

это даст вам доступ к температуре, которую вы желаете.

2 голосов
/ 15 февраля 2011

В Hashtable хранятся нетипизированные объекты: вам необходимо повторно преобразовать прочитанное значение обратно в строковый массив, например,

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

или

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

Однако вылучше использовать что-то напечатанное, например, Dictionary<> - тогда это будет просто работать:

Dictionary<string, string[]> ht = new Dictionary<string, string[]>();
...
string s = ht["LSN"][0];
1 голос
/ 15 февраля 2011
string[] aStrings = (string[])ht["LSN"];
string s = aStrings[0];
1 голос
/ 15 февраля 2011

Индексатор класса HashTable всегда возвращает экземпляр object. Вам нужно будет привести этот объект к массиву строк:

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

Тем не менее, рассмотрите использование вместо этого универсального Dictionary<TKey, TValue> класса.

1 голос
/ 15 февраля 2011

Так как Hashtable содержимое отображается как object, вам необходимо разыграть:

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

Но вам, вероятно, было бы лучше использовать строго типизированный контейнер, как предложено Ник .

1 голос
/ 15 февраля 2011

ваш ht["LSN"][0] вернет вам строковый массив.поэтому вам нужно добавить еще один индексатор, чтобы получить правильное значение.

((string[])ht["LSN"][0])[0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...