2013-08-02 4 views
-2

Я пытаюсь выяснить, как вы храните и извлекаете DataSets с помощью хеш-таблицы.C# Hashtable хранения DataSets

Вот что я пробовал, но я получаю недопустимое исключение литья, когда я его пытаюсь. Кроме того, как я могу перебрать этот хэш и получить ключ, а также набор данных

Hashtable myHash = new Hashtable(); 
myHash.Add("1", someDataSet); 
foreach (DataSet ds in myHash) 
{ 
    lblMessage.Text = lblMessage.Text + " - Hash ID + ds[0].TableName"; 
} 

Я, вероятно, следует добавить, что первые 2 строки кода прохода, он падает на третий.

+0

По какой причине вы по-прежнему используете не общие коллекции? Если вы использовали общий словарь '' <,> ', вы бы узнали, почему это проблема при * компиляции * времени ... –

+0

Никогда не слышал об общем словаре – Bojan

+0

Вы использовали generics * вообще *? Они были введены в C# 2.0. Я бы очень сильно посоветовал вам узнать о новых версиях C# - вы найдете все виды вещей проще. –

ответ

1

Попробуйте

foreach (DictionaryEntry entry in myHash) 
{ 
    DataSet ds = (DataSet)entry.Value; 
    lblMessage.Text = lblMessage.Text + " - Hash ID + ds[0].TableName"; 
} 

словарь проведет key и value как форма DictionaryEntry структуры, так что вы не можете отлиты из DictionaryEntry в DataSet на самом деле ваш набор данных добавляется значение в Hashtable так он будет расположен в DictionaryEntry.Value собственности

Редактировать Как уже упоминалось в комментариях DirectCast подходит

+1

Зачем использовать 'as', а не прямой литой? Если значение равно * not * a 'DataSet', это указывает на ошибку, которая в идеале вызовет сбой как можно скорее. –

+0

@JonSkeet Обычно я предпочитаю как ключевое слово с нулевой проверкой, чтобы избежать исключения во время выполнения. –

+1

Плохая идея. В большинстве случаев вы бросаете, потому что * знаете *, что вы ожидаете от типа, и любой другой тип указывает на ошибку. То, что вы делаете сейчас, эффективно поглощает исключения - гораздо лучше * получить * исключение во время выполнения, чем продолжать, как будто все в порядке, когда на самом деле обнаруживается ошибка. –

2

В настоящее время вы пытаетесь выполнить итерацию по всем парам ключ/значение, но отбросив их до DataSet. Вы можете исправить это легко, как:

foreach (DataSet ds in myHash.Values) 

Если вы действительно хотите ключ, а также, вы можете изменить переменную итерации, чтобы иметь тип DictionaryEntry, но нет никакой необходимости в использовании, что если вы не нужны ключи.

... но я бы сильно предположил, что вместо этого вы перейдете к общей коллекции.

+0

Можете ли вы привести пример как будет работать общая коллекция? – Bojan

+1

@ Bagzli: Если вы никогда раньше не использовали дженерики, стоит потратить немного времени, чтобы узнать о них с нуля - один пример не будет почти таким же полезным для вас. –