Сортированный словарь - C # - PullRequest
0 голосов
/ 18 января 2011

Я пытаюсь выяснить, как создать отсортированный словарь, в котором ключ сортируется не по алфавиту. Есть ли способ определить способ сортировки?

Например, ключи могут быть в следующем порядке:

AAA1X
AAB1Y
AAC1Y
AAA2X
AAB2Y
AAC2X

Хотя первые три буквы в алфавитном порядке, если я сортирую, как это, это будет смешивать их в неправильном порядке (из-за числа). Также обратите внимание, что в конце есть либо X, либо Y. В коде всегда будет только X или Y.

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

Я знаю, что это немного расплывчато, но любая помощь будет высоко ценится!

Ура!

Ответы [ 2 ]

15 голосов
/ 18 января 2011

Один из конструкторов для SortedDictionary<TKey, TValue> занимает IComparer<TKey>, где вы можете указать пользовательский класс сравнения, который словарь будет использовать для сортировки.

public class CustomComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        // do your own comparison however you like; return a negative value
        // to indicate that x < y, a positive value to indicate that x > y,
        // or 0 to indicate that they are equal.
    }
}

...

SortedDictionary<string, object> dict = 
              new SortedDictionary<string, object>(new CustomComparer());
0 голосов
/ 18 января 2011

Вы можете:

Создать класс, который инкапсулирует эти ключи и переопределить оператор ==, метод Object.Equals и метод Object.GetHashCode.Также попросите класс реализовать интерфейс IComparable , чтобы правила равенства автоматически сортировали ваши ключи правильно.Теперь вы можете просто поместить эти ключи в SortedDictionary или SortedList , и он будет автоматически сортироваться так, как вы хотите.

ИЛИ

Реализация объекта IComparer , который сравнивает эти строки так, как вы хотите, и указывает IComparer при создании SortedDictionary или SortedList .

...