2010-03-26 6 views
1

У меня есть словарь <> который я хочу сортировать по значению, поэтому я сделал это, поместив словарь в список <>, затем используя метод .Sort.Сортировка Словарь <> по значению, индекс поиска от ключа

Я добавил это обратно в словарь <>. Можно ли найти новый индекс/порядок с помощью ключа словаря?

Dictionary<int, MyObject> toCompare = new Dictionary<int, MyObject>(); 

toCompare.Add(0, new MyObject()); 
toCompare.Add(1, new MyObject()); 
toCompare.Add(2, new MyObject()); 

Dictionary<int, MyObject> items = new Dictionary<int, MyObject>(); 
List<KeyValuePair<int, MyObject>> values = new List<KeyValuePair<int, MyObject>> (toCompare); 

// Sort. 
values.Sort(new MyComparer()); 

// Convert back into a dictionary. 
foreach(KeyValuePair<int, PropertyAppraisal> item in values) 
{ 
     // Add to collection. 
    items.Add(item.Key, item.Value); 
} 

// THIS IS THE PART I CAN'T DO... 
int sortedIndex = items.GetItemIndexByKey(0); 
+1

Не упорядоченности Словаря неопределенный в C# Defenition? – Wouter

+1

Что вы пытаетесь сделать в мире? Если вам нужна уникальная коллекция, используйте словарь. Если вам нужен индекс элемента в отсортированном списке, используйте SortedList. –

+0

@Michael Todd: 'SortedList' - неправильное решение. Он хочет, чтобы элементы упорядочивались в соответствии с пользовательским сопоставлением * значений * в коллекции. –

ответ

3

Храните ваши данные в Dictionary<TKey,TValue>, но использовать List<TKey> для сортировки ключей, то итерацию как таковой:

IDictionary<int, MyObject> dict = new Dictionary<int, MyObject>(); 
// ... Populate dict with data. 

IList<int> keyList = new List<int>(); 
keyList.AddRange(dict.Keys); 

// Sort keyList based on key's value. 
// MyObject must implement IComparable<MyObject>. 
keyList.Sort(delegate(int x, int y) { 
    return dict[x].CompareTo(dict[y]); 
}); 

foreach (int key in keyList) { 
    MyObject value = dict[key]; 
} 

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

+0

У вас есть более привлекательный пример, поскольку мне нужно сортировать по значению не по ключу. Кроме того, я на .net 2.0. – paulio

+1

Добавлен сортировка фрагмента кода. – spoulson

+0

Спасибо за ваш ответ. – paulio

0

Возьмите этот метод расширения:

public static Dictionary<TKey, TValue> Sort<TKey, TValue, TSortingKey>(this Dictionary<TKey, TValue> source, 
    Func<KeyValuePair<TKey, TValue>, TSortingKey> selector) 
{ 
    var result = new Dictionary<TKey, TValue>(); 
    foreach (var pair in source.OrderBy(selector)) 
     result.Add(pair.Key, pair.Value); 
    return result; 
} 

И использование:

Dictionary<int, MyType> source = new Dictionary<int, MyType>(); 
    Dictionary<int, MyType> sortedDictionary = source.Sort(i => i.Value.Property1); //sort dictionary by values (by property "Property1" of type MyType 

Надеется, что это помогает

+0

К сожалению, я застрял с .net 2.0 – paulio

Смежные вопросы