Я нахожу это SortedList<TKey, TValue>
SortedDictionary<TKey, TValue>
и Dictionary<TKey, TValue>
реализую те же интерфейсы.
- Когда мы должны выбрать
SortedList
иSortedDictionary
сноваDictionary
? - В чем разница между
SortedList
иSortedDictionary
с точки зрения применения?
Ответы:
При итерации по элементам в любом из двух элементы будут отсортированы. Не так с
Dictionary<T,V>
.MSDN устраняет разницу между
SortedList<T,V>
иSortedDictionary<T,V>
:источник
SortedList
вы можете выполнять поиск по индексу (в отличие от поиска по ключу), а в немSortedDictionary
нельзя.Отмечу разницу между словарями.
На рисунке выше показано, что
Dictionary<K,V>
во всех случаях это равно или быстрее, чемSorted
аналог, но если требуется порядок элементов, например, для их печати,Sorted
выбирается один.Источник: http://people.cs.aau.dk/~normark/oop-csharp/html/notes/collections-note-time-complexity- dictionaries.html
источник
Immutable
версиями этих словарей,Sorted
версии часто на самом деле быстрее примерно на 40-50%, чем несортированные аналоги (все жеO(log(n))
, но заметно быстрее на операцию) . Однако время может отличаться в зависимости от того, как отсортирован ввод. См. Stackoverflow.com/a/30638592/111575Подводя итог результатам теста производительности - SortedList vs. SortedDictionary vs. Dictionary vs. Hashtable , результаты от лучшего к худшему для различных сценариев:
Использование памяти:
Вставки:
Поисковые операции:
операции цикла foreach
источник
Collection
нужно,sorted
вы можете забыть оHashtable
иDictionary
: если вы заполните свою коллекцию одним выстрелом -> перейдите к SortedList, но если вы ожидаете, что вам часто понадобится.Add
и.Remove
items -> перейдите к SortedDictionary.sorted
означает: когда вы выполняете,For Each MyItem in Collection
а не обрабатываете.Add
элементы в том порядке, в котором вы изначальноsorted
Collection
редактировали элементы, a будет обрабатывать их в порядке в соответствии с критериямиKey
значений (определенными в файлеIComparer
). Например, если ваши ключи являются строками, ваша коллекция по умолчанию будет обрабатываться в алфавитном порядке ваших ключей, но вы всегда можете определить собственное правило сортировки.Я вижу, что предлагаемые ответы сосредоточены на производительности. В статье, представленной ниже, нет ничего нового в отношении производительности, но в ней объясняются основные механизмы. Также обратите внимание, что он не фокусируется на трех
Collection
типах, упомянутых в вопросе, а обращается ко всем типамSystem.Collections.Generic
пространства имен.http://geekswithblogs.net/BlackRabbitCoder/archive/2011/06/16/c.net-fundamentals-choosing-the-right-collection-class.aspx
Выписки:
Словарь <>
Сортированный словарь <>
SortedList <>
Предварительное резюме основных процедур
Отзывы очень приветствуются, так как я уверен, что не все понял правильно.
n
.Словарь
объем памяти
KeyArray(n) -> non-sorted array<pointer>
ItemArray(n) -> non-sorted array<pointer>
HashArray(n) -> sorted array<hashvalue>
Добавить
HashArray(n) = Key.GetHash
# O (1)KeyArray(n) = PointerToKey
# O (1)ItemArray(n) = PointerToItem
# O (1)удалять
For i = 0 to n
, найтиi
гдеHashArray(i) = Key.GetHash
# O (log n) (отсортированный массив)HashArray(i)
# O (n) (отсортированный массив)KeyArray(i)
# O (1)ItemArray(i)
# O (1)Получить предмет
For i = 0 to n
, найтиi
гдеHashArray(i) = Key.GetHash
# O (log n) (отсортированный массив)ItemArray(i)
Переберите
For i = 0 to n
, возвращениеItemArray(i)
SortedDictionary
объем памяти
KeyArray(n) = non-sorted array<pointer>
ItemArray(n) = non-sorted array<pointer>
OrderArray(n) = sorted array<pointer>
Добавить
KeyArray(n) = PointerToKey
# O (1)ItemArray(n) = PointerToItem
# O (1)For i = 0 to n
, найтиi
гдеKeyArray(i-1) < Key < KeyArray(i)
(используяICompare
) # O (n)OrderArray(i) = n
# O (n) (отсортированный массив)удалять
For i = 0 to n
, найтиi
гдеKeyArray(i).GetHash = Key.GetHash
# O (n)KeyArray(SortArray(i))
# O (n)ItemArray(SortArray(i))
# O (n)OrderArray(i)
# O (n) (отсортированный массив)Получить предмет
For i = 0 to n
, найтиi
гдеKeyArray(i).GetHash = Key.GetHash
# O (n)ItemArray(i)
Переберите
For i = 0 to n
, возвращениеItemArray(OrderArray(i))
SortedList
объем памяти
KeyArray(n) = sorted array<pointer>
ItemArray(n) = sorted array<pointer>
Добавить
For i = 0 to n
, найтиi
гдеKeyArray(i-1) < Key < KeyArray(i)
(используяICompare
) # O (log n)KeyArray(i) = PointerToKey
# O (n)ItemArray(i) = PointerToItem
# O (n)удалять
For i = 0 to n
, найдитеi
гдеKeyArray(i).GetHash = Key.GetHash
# O (log n)KeyArray(i)
# O (n)ItemArray(i)
# O (n)Получить предмет
For i = 0 to n
, найдитеi
гдеKeyArray(i).GetHash = Key.GetHash
# O (log n)ItemArray(i)
Переберите
For i = 0 to n
, возвращениеItemArray(i)
источник
Если вы хотите, чтобы коллекция сортировалась по ключу при итерации по ней. Если вам не нужно сортировать данные, вам лучше использовать словарь, он будет работать лучше.
SortedList и SortedDictionary очень многое сделать то же самое, но реализованы по- разному, таким образом , имеют различные сильные и слабые стороны объясняется здесь .
источник
Пытаясь присвоить оценку производительности каждому случаю, представленному @Lev, я использовал следующие значения:
Результаты (выше = лучше):
Конечно, каждый вариант использования будет придавать большее значение определенным операциям.
источник