С# сортировка по 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.