列表中的分区键 <KeyValuePair> c#

Partition Keys in List<KeyValuePair> c#

我有一个键值对列表

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)Keys

范围内找到最高值和最低值
for (i=0; i<hitCoord.Count; i++)
{
     if (hitCoord[i].Key > (int lowerbound) && hitCoord[i].Key < (int upperBound)
     {
          find highest Value?
     }
}

不确定这是否完全正确。我是编程新手,对 KeyValuePairs 也很陌生。非常感谢您就此事提供的任何帮助!谢谢!

您不需要实际排序 - 您可以使用 Linq 执行此操作(将 using System.Linq; 添加到 .cs 文件的顶部)。您只需要一个 Where 来按键过滤,一个 Max 来获得最高值:

var maxValue = hitCoord.Where(hc => hc.Key > lowerbound && hc.Key < upperBound)
                       .Max(hc => hc.Value);

在指定的键范围内查找最大值可以使用 LINQ (using System.Linq;) 解决,如下所示:

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

方法:

  1. 使用Where过滤键在
  2. 范围内的所有项目
  3. 使用Max得到最大值

您还可以使用更多检查和约束来调整和扩展查询。 Basic LINQ Query Operations (C#).

中描述了一些基本查询

正如其他人所建议的那样,使用 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 以外的东西,这样您就可以优化它并避免多次浏览列表。