TheBigBearNow Ответов: 2

Получение min и max из массива или списка <keyvaluepair>


У меня есть многомерный массив с в основном парой ключ / значение. Я хотел бы суммировать все значения в соответствии с ключом, а затем выбрать минимальные и максимальные значения из этого.
Я попытался составить список "keyvaluepair"и словарь, чтобы сделать это, я подошел очень близко, но он не позволил мне отсортировать список двойников. Мои списки и массивы создаются правильно и без проблем. Я хотел бы отобразить минимальное/максимальное значение, а также отобразить ключ в той же строке
public static void PrintTable()
        {
            string text;
            var totals = new List<KeyValuePair<string, double>>();
            for(int i = 0; i < topics.Length; i++)
            {
                Console.Write(topics[i]  + " ");
                double num = 0;
                for(int j = 0; j < 10; j++)
                {
                    Console.Write(responses[i, j] + " ");
                    num += responses[i, j] * (j + 1);
                    totals.Add(new KeyValuePair<string, double>( topics[i], num));
                }
                average = num / userCounter;
                Console.Write("\t" + average.ToString("##.00"));
            }
            // Display highest points and lowest points.
            var addedSums = totals.GroupBy(k => k.Key).ToDictionary(a => a.Key, b => b.Sum(c => c.Value));
            foreach(var pair in addedSums.Values.OrderByDescending())
            {
                Console.WriteLine("Highest points: " + pair);
            }


Что я уже пробовал:

используя массивы/списки/кортежи/словари/keyvaluepairs и многое другое linq и многие другие способы попробовать это, я думал, что это будет просто

2 Ответов

Рейтинг:
5

Jatinath

Привет,

просто обновите код ниже. проверка на ненулевое значение здесь. [из строки № 18 в предыдущем коде]

List<KeyValuePair<string, double>> totals = new List<KeyValuePair<string, double>>()
                {
                   new KeyValuePair<string, double>("Key1", 10),

                   new KeyValuePair<string, double>("Key3", 0),
                   new KeyValuePair<string, double>("Key2", 15),
                   new KeyValuePair<string, double>("Key4", 13),
                   new KeyValuePair<string, double>("Key5",3)
               };

           double min = 0; double max = 0;
           string maxKey = "", minKey = "";
           foreach (KeyValuePair<string, double> kvp in totals)
           {
               //textBox1.Text +=string.Format("Key: {0} Value: {1} \n", kvp.Key, kvp.Value);
               if (max < kvp.Value)
               {
                   maxKey = kvp.Key;
                   max = kvp.Value;
               }
           }
           min = max;
           foreach (KeyValuePair<string, double> kvp in totals)
           {
               if (kvp.Value != 0) //(kvp.Value > 0)
               {
                   if (min > kvp.Value)
                   {
                       minKey = kvp.Key;
                       min = kvp.Value;
                   }
               }
           }
           textBox1.Text += string.Format("maxKey:{0} max: {1} minkey:{2} min: {3} \n", maxKey, max, minKey, min);
>

**Примечание: отметьте как ответ, если он окажется полезным.


Рейтинг:
1

Jatinath

List<KeyValuePair<string, double>> totals = new List<KeyValuePair<string, double>>()
                 {
                    new KeyValuePair<string, double>("Key1", 10),
                    new KeyValuePair<string, double>("Key2", 15),
                    new KeyValuePair<string, double>("Key3", 5),
                    new KeyValuePair<string, double>("Key4", 13)
                };

            double min = 0; double max = 0;
            string maxKey = "", minKey = "";
            foreach (KeyValuePair<string, double> kvp in totals)
            {
                if (max < kvp.Value)
                {
                    maxKey = kvp.Key;
                    max = kvp.Value;
                }
            }
            min = max;
            foreach (KeyValuePair<string, double> kvp in totals)
            {
                if (min > kvp.Value)
                {
                    minKey = kvp.Key;
                    min = kvp.Value;
                }
            }
            textBox1.Text += string.Format("maxKey:{0} max: {1} minkey:{2} min: {3} \n", maxKey, max, minKey, min);

**Примечание: Я написал вывод в текстовое поле вместо консоли

Отметьте ответ, если он окажется полезным.


TheBigBearNow

Это работает! Но теперь у меня осталась одна маленькая вещь. Я хочу исключить "0", поэтому, если он выберет 0 из моего списка, я хочу, чтобы он перешел к следующему наименьшему числу.
min не может быть 0