Структуры данных .NET: ArrayList, List, HashTable, Dictionary, SortedList, SortedDictionary - Скорость, память и когда их использовать? - PullRequest
207 голосов
/ 24 сентября 2008

.NET имеет много сложных структур данных. К сожалению, некоторые из них очень похожи, и я не всегда уверен, когда использовать один, а когда использовать другой. Большинство моих книг по C # и Visual Basic в определенной степени рассказывают о них, но они никогда не вдавались в подробности.

В чем разница между Array, ArrayList, List, Hashtable, Dictionary, SortedList и SortedDictionary?

Какие из них перечислимы (IList - может делать циклы 'foreach')? Какие из них используют пары ключ / значение (IDict)?

А как насчет памяти? Скорость вставки? Скорость поиска?

Есть ли еще какие-либо структуры данных, о которых стоит упомянуть?

Я все еще ищу дополнительную информацию об использовании памяти и скорости (обозначение Big-O).

Ответы [ 14 ]

2 голосов
/ 27 августа 2011

Важное замечание о Hashtable vs Dictionary для высокочастотного системного трейдинга: проблема безопасности потоков

Hashtable является поточно-ориентированным для использования несколькими потоками. Публичные статические члены словаря являются потокобезопасными, но гарантируется, что любые члены экземпляра не будут таковыми.

Таким образом, Hashtable остается «стандартным» выбором в этом отношении.

1 голос
/ 10 мая 2018

Самые популярные структуры данных и коллекции C #

  • Массив
  • ArrayList
  • Список
  • LinkedList
  • словарь
  • HashSet
  • Stack
  • Queue
  • SortedList

C # .NET имеет множество различных структур данных, например, одна из наиболее распространенных - это массив. Однако C # поставляется со многими более простыми структурами данных. Выбор правильной структуры данных для использования является частью написания хорошо структурированной и эффективной программы.

В этой статье я расскажу о встроенных структурах данных C #, в том числе о новых, представленных в C # .NET 3.5. Обратите внимание, что многие из этих структур данных применяются для других языков программирования.

Массив

Пожалуй, самой простой и распространенной структурой данных является массив. Массив C # - это список объектов. Его определяющими чертами является то, что все объекты имеют одинаковый тип (в большинстве случаев), и их имеется определенное количество. Природа массива обеспечивает очень быстрый доступ к элементам на основе их положения в списке (иначе называемом индексом). Массив C # определяется следующим образом:

[object type][] myArray = new [object type][number of elements]

Некоторые примеры:

 int[] myIntArray = new int[5];
 int[] myIntArray2 = { 0, 1, 2, 3, 4 };

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

ArrayList

Структура данных C #, ArrayList, является динамическим массивом. Это означает, что ArrayList может иметь любое количество объектов любого типа. Эта структура данных была разработана, чтобы упростить процессы добавления новых элементов в массив. Под капотом ArrayList - это массив, размер которого удваивается каждый раз, когда ему не хватает места. Удвоение размера внутреннего массива является очень эффективной стратегией, которая уменьшает количество копий элементов в долгосрочной перспективе. Мы не будем в доказательство этого здесь. Структура данных очень проста в использовании:

    ArrayList myArrayList = new ArrayList();
    myArrayList.Add(56);
    myArrayList.Add("String");
    myArrayList.Add(new Form());

Недостатком структуры данных ArrayList является приведение извлеченных значений обратно в исходный тип:

int arrayListValue = (int)myArrayList[0]

Источники и дополнительную информацию вы можете найти здесь :

1 голос
/ 25 сентября 2008

Существуют тонкие и не очень тонкие различия между общими и неуниверсальными коллекциями. Они просто используют разные базовые структуры данных. Например, Hashtable гарантирует «один писатель-много-читателей» без синхронизации. Словаря нет.

1 голос
/ 24 сентября 2008

На самом деле, я думаю, MSDN помогает дать довольно хорошие ответы на все эти вопросы. Просто посмотрите коллекции .NET.

...