Подтвердить что ты не робот

В чем разница между списком <> и словарем <> в С#

У меня есть странное сомнение относительно списка и словаря в С#

В списке мы добавляем элементы для списка, используя следующий метод

using System.Collections.Generic;

class Program
{
    static void Main()
    {
       List<int> list = new List<int>();
       list.Add(2);
       list.Add(3);
       list.Add(5);
       list.Add(7);
    }
}

В словаре мы добавляем такие элементы...

using System;
using System.Collections.Generic;

class Program
{
   static void Main()
   {
      Dictionary<string, int> d = new Dictionary<string, int>();
      d.Add("cat", 2);
      d.Add("dog", 1);
      d.Add("llama", 0);
      d.Add("iguana", -1);
   }
}

Я не знаю точно, в чем разница, но в словаре мы добавляем такие элементы, как пара (ключ, значение), и в списке мы просто добавляем элементы без указания какого-либо ключа.

Кто-нибудь прояснит это?

4b9b3361

Ответ 1

IDictionary предназначен для карт key- > value, ICollection для наборов похожих объектов.

ICollection - это интерфейс для коллекций похожих объектов: элементы управления в форме, элементы в списке, атрибуты в теге XML и т.д. Начиная с .NET 2.0, существует общая версия, поэтому вы можете ссылаться на коллекцию целых чисел как ICollection<int>.

IDictionary - это интерфейс для сопоставления одного типа объекта или значения другому. Он работает как настоящий словарь или телефонная книга: у вас есть "ключ" в виду, как имя человека, и когда вы его просматриваете, вы получаете некоторую информацию, идентифицированную этим ключом, например, адрес или номер телефона. Каждый ключ может быть указан только один раз, хотя две разные клавиши по-прежнему могут иметь одинаковое значение. Это также является общим в .NET 2.0, поэтому словарь, чьи ключи являются строками и значениями которых являются целые числа, будет IDictionary<string,int>.

Словарь фактически представляет собой набор пар ключ/значение: вы можете использовать IDictionary<int,string> как ICollection<KeyValuePair<int,string>>, и вы можете получить доступ к ключам и значениям в виде отдельных коллекций с помощью свойств "Ключи и значения".

Оба ICollection и IDictionary являются неупорядоченными, что означает, что, хотя вы можете получить элементы в некотором порядке с помощью метода CopyTo или цикла foreach, этот порядок не имеет особого значения, и он может измениться без видимых причина. Это основное отличие между ICollection и IList: список позволяет помещать элементы в определенные позиции, точно так же, как массив, и они остаются там, пока вы не переместите их.

Ответ 2

List<> и Dictionary<,> - довольно разные структуры данных, которые используются для разных целей, List - это просто набор элементов, а Dictionary - набор пар ключ-значение.

Словарь очень полезен, когда у вас есть набор сложных объектов и вы хотите иметь быстрый доступ, например ObjectName/ObjectId, в этом случае вы создаете IDictionary<string, TObject> , где ключ был бы ObjectId, а Value - самим объектом.

Некоторые отличия:

  • Список сохраняемых порядков элементов, Словарь не
  • Список позволяет быстрый доступ по индексу
  • Поддержка списка, встроенная в алгоритм QuickSort для быстрой сортировки данных
  • Словарь позволяет ~ O(1) сложность времени для доступа к элементу (значению) с помощью клавиши

Ответ 3

  • Dictionary<K,V> - ассоциативный массив или карта. Это контейнер, который может быть проиндексирован значениями любого типа.
  • List<T> - целочисленный индексированный массив. Это контейнер, который индексируется смежными целыми числами.

Существенное различие заключается в том, как индексируются контейнеры.

Не попадайте в ловушку, полагая, что Dictionary<int,T> семантически эквивалентно List<T>. Разница в том, что индексирование List<T> является смежным, тогда как в индексировании для Dictionary<int,T> могут быть пробелы.

Ответ 4

У меня есть библиотека классов, которая обращается к множеству T-sql sprocs; каждый sproc возвращает одну строку, но разные столбцы. Мне понадобилось решение общего назначения для извлечения значений, а Dictionary < > обеспечило гораздо более чистое решение, чем List < > .

Класс, общий для всех оболочек, объявляет

public Dictionary<string, String> datadict = new Dictionary<string, string>();

и

public Dictionary<string, String> LoadData(string sproc, string paramName, string paramValue)

Вызов считывателя, датадатчик загружается с помощью

for (int i = Reader.FieldCount; i != 0; i--)
 {
  datadict.Add(Reader.GetName(i - 1).Trim(), Reader.GetString(i - 1).Trim());
 }

и возвращает datadict вызывающему классу, который затем может извлекать данные так же, как Reader; Например:.

datadict = myData.LoadData("spGetSSN", "", "");
  ssn1 = datadict["SSN1"];
  ssn2 = datadict["SSN2"];
  ssn3 = datadict["SSN3"];

Многое для меня, что List < > .