В чем разница между списком <> и словарем <> в c # - PullRequest
16 голосов
/ 27 октября 2011

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

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

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);
   }
}

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

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

Ответы [ 4 ]

32 голосов
/ 27 октября 2011

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

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

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

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

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

10 голосов
/ 27 октября 2011

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

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

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

  • Список сохраняются в порядке пунктов, словарь не
  • Список разрешает быстрый доступ по индексу
  • Поддержка списка, встроенная в алгоритм быстрой сортировки для быстрой сортировки данных
  • Словарь позволяет ~ O(1) временной сложности получить доступ к элементу (значению) по ключу
6 голосов
/ 27 октября 2011
  • Dictionary<K,V> - это ассоциативный массив или карта.Это контейнер, который может быть проиндексирован значениями любого типа.
  • List<T> - это целочисленный индексированный массив.Это контейнер, который индексируется непрерывными целыми числами.

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

0 голосов
/ 20 марта 2015

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

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

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

и

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

При вызове Reader объект данных загружается с

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

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

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

Намного чище этот Список <>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...