Есть ли в С# коллекция уникальных ключей отсортированного списка?
Я немного удивлен System.Collections.Generic.SortedList, в этом
- Мне нужно использовать
<key, value>
вместо <value>
(comparer)
- Он разрешает только запись на значение
Они кажутся причудливыми в том, как я хочу его использовать (хотя я уверен, что они подходят для других ситуаций). Есть ли другая коллекция, которая не имеет этих двух характеристик?
Ответы
Ответ 1
SortedList<,>
- это действительно карта, отсортированная по ключу, а не список. Возможно, плохое имя. Но есть способы подражать тому, что вы хотите, в зависимости от ваших точных требований. Вы можете, например, инкапсулировать a SortedList<T, int>
и добавить/удалить что-то вроде:
// add
int count;
if(list.TryGetValue(value, out count)) list[value] = count+1;
else list[value] = 1;
В конечном итоге вы также можете использовать простой список (List<>
) - это зависит от того, что вы делаете.
В частности, я ожидаю, что привязка к данным и т.д. затрудняет реализацию обычного списка, который сортируется сразу - вам нужно реализовать множество интерфейсов, чтобы получить эту работу, так как обычно он ожидает, что элемент, который вы добавляете, останется на конец.
Ответ 2
Я не уверен, что это будет соответствовать вашим требованиям. Но вы можете сортировать обычный список. MSDN говорит об этом, но, очевидно, для этого требуется вызвать сортировку.
Ответ 3
Я пробовал найти то же самое: в основном список, который остается упорядоченным, когда вы добавляете в него элементы. Самое близкое, что я нашел до сих пор, это SortedSet из Goletas.Collections, который использует реализацию дерева AVL:
http://www.goletas.com/solutions/collections/
Но этот класс по-прежнему требует, чтобы каждый элемент в списке был уникальным (следовательно, "Set" ).
Возможно, этот класс может быть изменен для поддержки неповторимых элементов.
Ответ 4
Я знаю, что это старый вопрос, но я просто наткнулся на этот другой вопрос (С# Sortable collection, который позволяет дублировать ключи), который дает решение: используйте собственный IComparer с SortedSet!
То есть.
/// <summary>
/// Comparer for comparing two keys, handling equality as being greater
/// Use this Comparer e.g. with SortedSets, SortedLists or SortedDictionaries, that don't allow duplicate keys
/// </summary>
/// <typeparam name="TKey"></typeparam>
public class DuplicateKeyComparer<TKey> : IComparer<TKey> where TKey : IComparable
{
#region IComparer<TKey> Members
public int Compare(TKey x, TKey y)
{
int result = x.CompareTo(y);
return result == 0 ? 1 : result; // Handle equality as being greater
}
#endregion
}
Использование:
SortedSet<T> mySortedValues = new SortedSet<T>(new DuplicateKeyComparer<T>());
Изменить: во-вторых, это, вероятно, плохая идея для чего-либо другого, кроме SortedSet<T>
, поскольку вы, вероятно, не сможете найти разные значения, связанные с дублирующими ключами, используя что-либо, кроме цикла foreach
; и SortedSet<T>
было бы лучше представлено SortedList<TKey,TValue>
, когда TKey является интересным значением, а TValue является счетчиком (например, int
) числа дубликатов этого объекта.
Ответ 5
Если это не критично, вы можете использовать
1) Linq OrderBy() или
2) Метод списка Сортировка()
См. этот пример
var list = new List<int>();
list.Add( 2);
list.Add( 1);
list.Add( 3);
Console.WriteLine("Using Linq OrderBy");
foreach (int i in list.OrderBy(i=>i))
Console.WriteLine(i);
Console.WriteLine("Using List.Sort()");
list.Sort();
foreach (int i in list)
Console.WriteLine(i);