我有一个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的新手。您在此问题上可以提供的任何帮助,将不胜感激!谢谢!
可以通过使用LINQ(using System.Linq;
)来解决在指定键范围内找到最大值的问题:
hitCoord.Where(c => c.Key > lowerbound && c.Key < upperbound).Max(c => c.Value);
方法:
Where
过滤范围内有键的所有项目Max
获得最大值您还可以通过更多检查和约束来适应和扩展查询。 Basic LINQ Query Operations (C#)中描述了一些基本查询。
您不需要实际排序-您可以使用Linq进行此操作(将using System.Linq;
添加到.cs文件的顶部)。您只需要Where
按键过滤,而Max
可获得最大值:
var maxValue = hitCoord.Where(hc => hc.Key > lowerbound && hc.Key < upperBound)
.Max(hc => hc.Value);
正如其他人建议的那样,使用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以外的其他东西,以便可以对其进行优化,避免多次浏览列表。