С# сортировка по StringDictionary по значению, NOT key

Что такое "лучший" способ сортировки (или повторения) над StringDictionary в порядке значения (не ключа)

например. Key - Value

  • 1 - метка X
  • 2 - Ярлык
  • 3 - Другая метка

даст

  • 2 - Ярлык
  • 3 - Другая метка
  • 1 - метка X

EDIT - я хотел сказать "использование возможностей .NET 2.0". Извините, мне плохо...

Ответ 1

Используйте LINQ:

var items = from k in d.Keys
                    orderby d[k] ascending
                    select k;

Если вы ограничены функциями С# 2.0, используйте это:

    IDictionary<string, string> d = new Dictionary<string, string>();
    d["1"] = "X label";
    d["2"] = "A label";
    d["3"] = "Other Label";

    List<KeyValuePair<string, string>> myList = new List<KeyValuePair<string, string>>(d);
    myList.Sort(
        delegate(KeyValuePair<string, string> a,
        KeyValuePair<string, string> b)
        {
            return a.Value.CompareTo(b.Value);
        }
    );

Примечание: Если вы используете StringDictionary вместо словаря, проверьте решение Anthony.

Ответ 2

Используя класс StringDictionary, здесь используется метод LINQ OrderBy. Предполагается, что у вас есть .NET 3.5.

var sortedDictionary = dictionary.Cast<DictionaryEntry>().OrderBy(pair => pair.Value);

Используя 2.0, это немного сложнее. Здесь используется подход с использованием делегата сравнения.

StringDictionary dictionary = new StringDictionary();
dictionary.Add("1", "One");
dictionary.Add("2", "Two");
dictionary.Add("3", "Three");

DictionaryEntry[] sortedDictionary = new DictionaryEntry[dictionary.Count];
dictionary.CopyTo(sortedDictionary, 0);
Comparison<DictionaryEntry> comparison = new Comparison<DictionaryEntry>(delegate (DictionaryEntry obj1, DictionaryEntry obj2) { return ((string)obj1.Value).CompareTo((string)obj2.Value); });
Array.Sort(sortedDictionary, comparison);

Таким образом, фактический вид будет находиться в массиве sortedDictionary.