Возможный дубликат:
Почему словарь предпочтительнее, чем хеш-таблица на С#?
В чем разница между Словарем и Hashtable. Как решить, какой из них использовать?
Возможный дубликат:
Почему словарь предпочтительнее, чем хеш-таблица на С#?
В чем разница между Словарем и Hashtable. Как решить, какой из них использовать?
Просто Dictionary<TKey,TValue>
- это общий тип, позволяющий:
Если вы являетесь .NET 2.0 или выше, вам следует предпочесть Dictionary<TKey,TValue>
(и другие общие коллекции)
Тонкая, но важная разница заключается в том, что Hashtable
поддерживает несколько потоков чтения с одним потоком записи, а Dictionary
не обеспечивает безопасность потока. Если вам нужна безопасность потоков с помощью общего словаря, вы должны реализовать свою собственную синхронизацию или (в .NET 4.0) использовать ConcurrentDictionary<TKey, TValue>
.
Давайте дадим пример, который объяснил бы разницу между хеш-таблицей и словарем.
Вот метод, реализующий hashtable
public void MethodHashTable()
{
Hashtable objHashTable = new Hashtable();
objHashTable.Add(1, 100); // int
objHashTable.Add(2.99, 200); // float
objHashTable.Add('A', 300); // char
objHashTable.Add("4", 400); // string
lblDisplay1.Text = objHashTable[1].ToString();
lblDisplay2.Text = objHashTable[2.99].ToString();
lblDisplay3.Text = objHashTable['A'].ToString();
lblDisplay4.Text = objHashTable["4"].ToString();
// ----------- Not Possible for HashTable ----------
//foreach (KeyValuePair<string, int> pair in objHashTable)
//{
// lblDisplay.Text = pair.Value + " " + lblDisplay.Text;
//}
}
Ниже для словаря
public void MethodDictionary()
{
Dictionary<string, int> dictionary = new Dictionary<string, int>();
dictionary.Add("cat", 2);
dictionary.Add("dog", 1);
dictionary.Add("llama", 0);
dictionary.Add("iguana", -1);
//dictionary.Add(1, -2); // Compilation Error
foreach (KeyValuePair<string, int> pair in dictionary)
{
lblDisplay.Text = pair.Value + " " + lblDisplay.Text;
}
}
Существует еще одно важное различие между HashTable и Dictionary. Если вы используете индексаторы для получения значения из HashTable, HashTable будет успешно возвращать значение null для несуществующего элемента, тогда как словарь будет вызывать ошибку, если вы попытаетесь получить доступ к элементу с помощью индексатора, которого нет в словаре
Словарь напечатан (так что для ценностных типов не нужен бокс), у Hashtable нет (так что для центов необходимо бокс). Hashtable имеет более удобный способ получения значения, чем словарь IMHO, потому что он всегда знает, что значение является объектом. Хотя, если вы используете .NET 3.5, легко написать метод расширения для словаря, чтобы получить аналогичное поведение.
Если вам нужно несколько значений для ключа, ознакомьтесь со своим исходным кодом MultiValueDictionary: multimap в .NET
Хотите добавить разницу:
Попытка избежать несуществующего ключа дает ошибку времени выполнения в словаре, но не проблема в хэш-таблице, поскольку она возвращает значение null вместо ошибки.
например.
//No strict type declaration
Hashtable hash = new Hashtable();
hash.Add(1, "One");
hash.Add(2, "Two");
hash.Add(3, "Three");
hash.Add(4, "Four");
hash.Add(5, "Five");
hash.Add(6, "Six");
hash.Add(7, "Seven");
hash.Add(8, "Eight");
hash.Add(9, "Nine");
hash.Add("Ten", 10);// No error as no strict type
for(int i=0;i<=hash.Count;i++)//=>No error for index 0
{
//Can be accessed through indexers
Console.WriteLine(hash[i]);
}
Console.WriteLine(hash["Ten"]);//=> No error in Has Table
здесь нет ошибки для клавиши 0, а также для клавиши "десять" (примечание: t мало)
//Strict type declaration
Dictionary<int,string> dictionary= new Dictionary<int, string>();
dictionary.Add(1, "One");
dictionary.Add(2, "Two");
dictionary.Add(3, "Three");
dictionary.Add(4, "Four");
dictionary.Add(5, "Five");
dictionary.Add(6, "Six");
dictionary.Add(7, "Seven");
dictionary.Add(8, "Eight");
dictionary.Add(9, "Nine");
//dictionary.Add("Ten", 10);// error as only key, value pair of type int, string can be added
//for i=0, key doesn't exist error
for (int i = 1; i <= dictionary.Count; i++)
{
//Can be accessed through indexers
Console.WriteLine(dictionary[i]);
}
//Error : The given key was not present in the dictionary.
//Console.WriteLine(dictionary[10]);
здесь ошибка для ключа 0, а также для ключа 10, так как оба они не существуют в словаре, ошибка времени выполнения, хотя и пытаются не работать.
Класс Hashtable - это определенный тип словарного класса, который использует целочисленное значение (называемое хешем), чтобы помочь в хранении его ключей. Класс Hashtable использует хеш для ускорения поиска определенного ключа в коллекции. Каждый объект в .NET происходит из класса Object. Этот класс поддерживает метод GetHash, который возвращает целое число, которое однозначно идентифицирует объект. Класс Hashtable - очень эффективная коллекция в целом. Единственная проблема с классом Hashtable заключается в том, что для этого требуется немного накладных расходов, а для небольших коллекций (менее десяти элементов) накладные расходы могут затруднять производительность.
Существует определенная разница между двумя, которые необходимо учитывать:
HashTable: это не общий набор, самые большие издержки этого коллекция заключается в том, что он автоматически боксирует ваши ценности и для того, чтобы получить исходное значение, необходимо выполнить распаковку, чтобы снизить производительность приложения в виде штрафа.
Словарь: это общий тип коллекции, где не подразумевается бокс, так что вам не нужно распаковывать, вы всегда получите свой оригинал которые вы сохранили, чтобы улучшить ваше приложение. производительность.
Второе Значимое различие:
если вы пытались получить доступ к значению из хэш-таблицы на основе ключа, который не существует, он вернет null. Но в случае Словарь даст вам KeyNotFoundException.
Интерфейс ILookup используется в .net 3.5 с linq.
HashTable - это базовый класс, который слабо тип; Словарь абстрактный класс стробируется и использует внутренне HashTable.
Я нашел странную вещь о Словаре, когда мы добавляем несколько записей в Словарь, порядок, в котором добавляются записи, поддерживается. Таким образом, если я применил foreach в словаре, я получу записи в том же порядке, в который я их вставил.
В то время как это не относится к обычным HashTable, так как когда я добавляю те же записи в Hashtable, порядок не поддерживается. Насколько я знаю, словарь основан на Hashtable, если это правда, почему мой словарь поддерживает порядок, но HashTable не делает?
Что касается того, почему они ведут себя по-другому, потому что Generic Dictionary реализует хэш-таблицу, но не основан на System.Collections.Hashtable. Реализация Generic Dictionary основана на выделении пар ключ-значение из списка. Затем они индексируются с помощью хэш-таблиц для случайного доступа, но когда он возвращает перечислитель, он просто просматривает список в последовательном порядке - это будет порядок вставки, если записи не будут повторно использоваться.
shiv govind Birlasoft:).