Существует ли в C # универсальная коллекция отсортированных списков неуникальных ключей? - PullRequest
21 голосов
/ 17 ноября 2009

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

  1. Требуется, чтобы я использовал <key, value> вместо <value> (для сравнения)
  2. Позволяет вводить только значение

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

Ответы [ 5 ]

7 голосов
/ 17 ноября 2009

SortedList<,> действительно карта, отсортированная по ключу, а не список. Возможно, плохое название. Но есть способы подражать тому, что вы хотите, в зависимости от ваших конкретных требований. Вы можете, например, инкапсулировать SortedList<T, int> и добавить / удалить что-то вроде:

// add
int count;
if(list.TryGetValue(value, out count)) list[value] = count+1;
else list[value] = 1;

В конечном итоге вы также можете использовать простой список (List<>) - это зависит от того, что вы делаете.

Частично я ожидаю, что привязка данных и т. Д. Затруднит реализацию обычного списка, который сортируется немедленно - вам нужно реализовать много интерфейсов, чтобы это работало, как обычно это ожидает Вы добавляете, чтобы остаться в конце.

2 голосов
/ 17 ноября 2009

Я не уверен, будет ли это соответствовать вашим требованиям. Но вы можете отсортировать обычный список. MSDN говорит об этом, но, очевидно, для этого требуется вызов sort.

1 голос
/ 06 января 2016

Я знаю, что это старый вопрос, но я только что натолкнулся на другой вопрос ( C # Сортируемая коллекция, которая позволяет дублировать ключи ), которая дает решение: используйте свой собственный IComparer с SortedSet! * Т.е. 1003 *

/// <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) числа дубликатов этого объекта.

1 голос
/ 13 марта 2010

Я пытался найти то же самое: в основном список, который остается упорядоченным, когда вы добавляете в него элементы. Самым близким, что я нашел, является SortedSet от Goletas.Collections, который использует реализацию дерева AVL:

http://www.goletas.com/solutions/collections/

Но этот класс по-прежнему требует, чтобы каждый элемент в списке был уникальным (следовательно, "Set").

Возможно, этот класс можно изменить для поддержки неуникальных предметов.

0 голосов
/ 14 апреля 2014

Если это не критично для производительности, вы можете использовать либо

1) Linq OrderBy () или

2) Метод списка Sort ()

См. Этот пример

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