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

Есть ли в С# коллекция уникальных ключей отсортированного списка?

Я немного удивлен System.Collections.Generic.SortedList, в этом

  • Мне нужно использовать <key, value> вместо <value> (comparer)
  • Он разрешает только запись на значение

Они кажутся причудливыми в том, как я хочу его использовать (хотя я уверен, что они подходят для других ситуаций). Есть ли другая коллекция, которая не имеет этих двух характеристик?

4b9b3361

Ответ 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);