Ключи разделов в списке <KeyValuePair>c# - PullRequest
0 голосов
/ 01 мая 2020

У меня есть список KeyValuePairs

var hitCoord = new List<KeyValuePair<int, double>>()

и отсортирован таким образом (по убыванию по ключу)

hitCoord.Sort((a, b) => (b.Key.CompareTo(a.Key)));

Я могу найти общее наибольшее значение с помощью

hitCoord.Sort((a, b) => (b.Value.CompareTo(a.Value)));

(^ может быть, это можно использовать для следующего запроса?)

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

т.е. я хотел бы найти самое высокое значение и самое низкое значение в диапазоне (int) ключей

for (i=0; i<hitCoord.Count; i++)
{
     if (hitCoord[i].Key > (int lowerbound) && hitCoord[i].Key < (int upperBound)
     {
          find highest Value?
     }
}

Не уверен, что это вообще на правильном пути. Я новичок в программировании и очень плохо знаком с KeyValuePairs. Любая помощь, которую вы можете предложить по этому вопросу, высоко ценится! Спасибо!

Ответы [ 3 ]

1 голос
/ 01 мая 2020

Нахождение максимального значения в указанном диапазоне клавиш можно решить с помощью LINQ (using System.Linq;) следующим образом:

hitCoord.Where(c => c.Key > lowerbound && c.Key < upperbound).Max(c => c.Value);

Подход:

  1. Использование Where для фильтрации всех элементов с ключом в диапазоне
  2. Используйте Max для получения максимального значения

Вы можете адаптировать и расширить запрос также с большим количеством проверок и ограничений. Некоторые основные запросы c описаны в Основные операции c Операции с запросами LINQ (C#) .

1 голос
/ 01 мая 2020

Вам не нужно на самом деле сортировать - вы можете сделать это с помощью Linq (добавив using System.Linq; в начало вашего файла .cs). Вы просто хотите, чтобы Where фильтровал по ключу и Max, чтобы получить наибольшее значение:

var maxValue = hitCoord.Where(hc => hc.Key > lowerbound && hc.Key < upperBound)
                       .Max(hc => hc.Value);
0 голосов
/ 01 мая 2020

Как и предполагали другие, все это довольно легко сделать с помощью linq. Вот еще один пример вызовов linq, в том числе о том, как создать поиск по разделу.

var hitCoord = new List<KeyValuePair<int, double>>()
{
    new KeyValuePair<int, double>(1, 1.1),
    new KeyValuePair<int, double>(1, 1.2),
    new KeyValuePair<int, double>(2, 2.0),
    new KeyValuePair<int, double>(2, 2.1)
};

var partitions = hitCoord.ToLookup(kvp => kvp.Key % 2);

var maxKvp = hitCoord.Max(kvp => kvp.Key);
var minKvp = hitCoord.Min(kvp => kvp.Key);

int lower = 1;
int higher = 2;

var maxInRange = hitCoord.Where(kvp => kvp.Key >= lower && kvp.Key <= higher).Max(kvp => kvp.Key);

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

...