Ответ 1

Просто Dictionary<TKey,TValue> - это общий тип, позволяющий:

  • статическая типизация (и проверка времени компиляции)
  • использование без бокса

Если вы являетесь .NET 2.0 или выше, вам следует предпочесть Dictionary<TKey,TValue> (и другие общие коллекции)

Тонкая, но важная разница заключается в том, что Hashtable поддерживает несколько потоков чтения с одним потоком записи, а Dictionary не обеспечивает безопасность потока. Если вам нужна безопасность потоков с помощью общего словаря, вы должны реализовать свою собственную синхронизацию или (в .NET 4.0) использовать ConcurrentDictionary<TKey, TValue>.

Ответ 2

Давайте дадим пример, который объяснил бы разницу между хеш-таблицей и словарем.

Вот метод, реализующий 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;
    }
  }

Ответ 3

Существует еще одно важное различие между HashTable и Dictionary. Если вы используете индексаторы для получения значения из HashTable, HashTable будет успешно возвращать значение null для несуществующего элемента, тогда как словарь будет вызывать ошибку, если вы попытаетесь получить доступ к элементу с помощью индексатора, которого нет в словаре

Ответ 4

Словарь напечатан (так что для ценностных типов не нужен бокс), у Hashtable нет (так что для центов необходимо бокс). Hashtable имеет более удобный способ получения значения, чем словарь IMHO, потому что он всегда знает, что значение является объектом. Хотя, если вы используете .NET 3.5, легко написать метод расширения для словаря, чтобы получить аналогичное поведение.

Если вам нужно несколько значений для ключа, ознакомьтесь со своим исходным кодом MultiValueDictionary: multimap в .NET

Ответ 5

Хотите добавить разницу:

Попытка избежать несуществующего ключа дает ошибку времени выполнения в словаре, но не проблема в хэш-таблице, поскольку она возвращает значение 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, так как оба они не существуют в словаре, ошибка времени выполнения, хотя и пытаются не работать.

Ответ 6

Класс Hashtable - это определенный тип словарного класса, который использует целочисленное значение (называемое хешем), чтобы помочь в хранении его ключей. Класс Hashtable использует хеш для ускорения поиска определенного ключа в коллекции. Каждый объект в .NET происходит из класса Object. Этот класс поддерживает метод GetHash, который возвращает целое число, которое однозначно идентифицирует объект. Класс Hashtable - очень эффективная коллекция в целом. Единственная проблема с классом Hashtable заключается в том, что для этого требуется немного накладных расходов, а для небольших коллекций (менее десяти элементов) накладные расходы могут затруднять производительность.

Существует определенная разница между двумя, которые необходимо учитывать:

HashTable: это не общий набор, самые большие издержки этого коллекция заключается в том, что он автоматически боксирует ваши ценности и для того, чтобы получить исходное значение, необходимо выполнить распаковку, чтобы снизить производительность приложения в виде штрафа.

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

Второе Значимое различие:

если вы пытались получить доступ к значению из хэш-таблицы на основе ключа, который не существует, он вернет null. Но в случае Словарь даст вам KeyNotFoundException.

Ответ 7

Интерфейс ILookup используется в .net 3.5 с linq.

HashTable - это базовый класс, который слабо тип; Словарь абстрактный класс стробируется и использует внутренне HashTable.

Я нашел странную вещь о Словаре, когда мы добавляем несколько записей в Словарь, порядок, в котором добавляются записи, поддерживается. Таким образом, если я применил foreach в словаре, я получу записи в том же порядке, в который я их вставил.

В то время как это не относится к обычным HashTable, так как когда я добавляю те же записи в Hashtable, порядок не поддерживается. Насколько я знаю, словарь основан на Hashtable, если это правда, почему мой словарь поддерживает порядок, но HashTable не делает?

Что касается того, почему они ведут себя по-другому, потому что Generic Dictionary реализует хэш-таблицу, но не основан на System.Collections.Hashtable. Реализация Generic Dictionary основана на выделении пар ключ-значение из списка. Затем они индексируются с помощью хэш-таблиц для случайного доступа, но когда он возвращает перечислитель, он просто просматривает список в последовательном порядке - это будет порядок вставки, если записи не будут повторно использоваться.

shiv govind Birlasoft:).