C # Сортировка словаряв порядке убывания по значению - без Linq в .net 2.0 - PullRequest
0 голосов
/ 27 октября 2018

Как сортировать общий словарь (строка, число с плавающей точкой) в порядке убывания по значению без использования Linq, используя только функции, доступные в .net 2.0 .

Просто обратите внимание, что я не собираюсь сортировать значения самостоятельно - ключ должен быть как-то связан со значением. (В противном случае я бы спросил, как отсортировать список, верно?)

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

с использованием только функций, доступных в .net 2.0

Предполагая, что вы установили многоцелевые пакеты для Visual Studio, вы должны иметь возможность ориентироваться на конкретную инфраструктуру при создании проекта.,Вы также можете изменить целевой фреймворк через страницы свойств проекта.

FrameWork Selection

Если вам также необходимо указать поддерживаемую языковую версию, это можно установить с помощьюСвойства проекта Build Tab, нажав на кнопку «Дополнительно».В этом случае ISO-2 выбирается в соответствии с C # V2, выпущенным как часть VS2005 вместе с .Net 2.0.

Language Version Selection

Если вынужна информация о мульти-таргетинге, см .:

При настроенной таким образом среде проекта вы сможете использовать только функции, доступные в .Net 2.0 и C # 2.0.Это включает в себя то, что вы увидите в обозревателе объектов.

Теперь рассмотрим проблему, отсортировав содержимое Dictionary<string, float> по значению.

Простой способ - извлечь пары ключ-значение в класс, поддерживающий сортировку.В приведенном ниже примере для хранения значений используется List<KeyValuePair<string, float>>.Метод сортировки списка передается делегату System.Comparison этому методу, который определяет логику сравнения.Логика сравнения предназначена для сортировки как по значению (по убыванию), так и по ключу (по возрастанию), если значения равны.

public void Test()
{
    Dictionary<string, float> dict = new Dictionary<string, float>();
    dict.Add("A1", 3);
    dict.Add("A2", 30);
    dict.Add("Z", 30);
    dict.Add("A3", 30);
    dict.Add("F", 5);

    List<KeyValuePair<string, float>> sorted = new List<KeyValuePair<string, float>>(dict);
    sorted.Sort(new Comparison<KeyValuePair<string, float>>(CompareKvp));
    foreach(KeyValuePair<string, float> kvp in sorted)
    {
        Console.WriteLine(kvp.ToString());
    }
}

private static Int32 CompareKvp(KeyValuePair<string, float> kvp1, KeyValuePair<string, float> kvp2)
{
    int ret = - kvp1.Value.CompareTo(kvp2.Value); // negate for descending
    if (ret == 0)
    {
        ret = kvp1.Key.CompareTo(kvp2.Key); // Ascend comp for Key
    }
    return ret; 
}

В этом примере будут получены упорядоченные пары ключ-значение:

[A2, 30]
[A3, 30]
[Z, 30]
[F, 5]
[A1, 3]
0 голосов
/ 27 октября 2018

Если вы просто хотите отсортированный массив с плавающей точкой, это соответствует .net 2

var dict = new Dictionary<string,float>();
var values = new float[dict.Count];
dict.Values.CopyTo(values, 0);
Array.Sort(values);
Array.Reverse(values);

Или

private class SortDesc : IComparer
{
   int IComparer.Compare(object a, object b)
   {
      var c1 = (KeyValuePair<string, float>)a;
      var c2 = (KeyValuePair<string, float>)b;
      if (c1.Value > c2.Value)
         return -1;
      return c1.Value < c2.Value ? 1 : 0;
   }
}

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

var dict = new Dictionary<string, float>();
var result = new KeyValuePair<string, float>[dict.Count];
((ICollection<KeyValuePair<string, float>>)dict).CopyTo(result, 0);

var sortDesc = new SortDesc();      
Array.Sort(result, sortDesc);

Отказ от ответственности : полностью не проверено

Я считаю своим долгом отметить, что .Net 2.0 больше не поддерживается и больше не поставляется

enter image description here

...