Сортировать словарь <> по значению, индекс поиска по ключу - PullRequest
1 голос
/ 26 марта 2010

У меня есть словарь <>, который я хочу отсортировать по значению, поэтому я сделал это, поместив словарь в список <>, а затем используя метод .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);

Ответы [ 2 ]

3 голосов
/ 26 марта 2010

Сохраните ваши данные в 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 голосов
/ 26 марта 2010

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

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

Надеюсь, это поможет

...