列表中的分区键 <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);
方法:
- 使用
Where
过滤键在 范围内的所有项目
- 使用
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 以外的东西,这样您就可以优化它并避免多次浏览列表。
我有一个键值对列表
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);
方法:
- 使用
Where
过滤键在 范围内的所有项目
- 使用
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 以外的东西,这样您就可以优化它并避免多次浏览列表。