列表中的分区键 c#

问题描述 投票:0回答:3

我有一个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的新手。您在此问题上可以提供的任何帮助,将不胜感激!谢谢!

c# keyvaluepair
3个回答
1
投票

可以通过使用LINQ(using System.Linq;)来解决在指定键范围内找到最大值的问题:

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

方法:

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

您还可以通过更多检查和约束来适应和扩展查询。 Basic LINQ Query Operations (C#)中描述了一些基本查询。


1
投票

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

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

0
投票

正如其他人建议的那样,使用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以外的其他东西,以便可以对其进行优化,避免多次浏览列表。

© www.soinside.com 2019 - 2024. All rights reserved.