如何从SortedDictionary中获得最大/最小值

本文关键字:最小值 SortedDictionary | 更新日期: 2023-09-27 18:09:07

我已经按照规定构建了一个SortedDictionary<int, FlowLayoutPanel> panels。我现在正在像这样循环遍历字典

foreach (var key in panels.Keys.ToList())
{
    FlowLayoutPanel tallestPanel = panels[key];
}

获取键值最大的表项。我现在正试图编写另一个循环,不断地应用一个操作,直到字典的Count为0。在这个循环中,我需要在每次迭代时从字典中获取最大值和最小值。我已经阅读了SortedDictionary MSDN条目,看起来我需要使用linq来完成这一点。这是真的吗?我该怎么做呢?(我从未碰过linq)

还有一个额外的问题,我找不到一个很好的答案,SortedDictionaries从最大到最小的值排序,即如果<int, FlowLayoutPanel>中的int代表FlowLayoutPanels.Height,上面的循环会不断给我最高的面板吗?

如何从SortedDictionary中获得最大/最小值

您可以从SortedDictionary中分别获得最小值和最大值的FirstLast密钥。

int minKey = 0;
int maxKey = 0;
if (panels.Keys.Count >= 2)
{
    minKey = panels.Keys.First();
    maxKey = panels.Keys.Last();
}

您也可以使用Enumerable.MinEnumerable.Max,如:

minKey = panels.Keys.Min();
maxKey = panels.Keys.Max();

因为键是在panels.Keys中排序的,所以最小和最大键将是panels.Keys中的第一个和最后一个项。你不需要LINQ来做这些:

var keys = panels.Keys.ToList();
// manually-determined indexes
var min = panels[keys[0]];
var max = panels[keys[keys.Count - 1]];

虽然有争议,但使用它会更清晰:

var keys = panels.Keys.ToList();
// or with LINQ
var min = panels[keys.First()];
var max = panels[keys.Last()];

如果你想从循环中获得这些值,通过panel.Keys.ToList()循环并从字典中删除每个项(这就是我认为你正在描述的),最小值总是当前的,最大值总是最后的。

var keys = panels.Keys.ToList();
var max = panels[keys.Last()];
foreach (var key in keys)
{
    var min = panels[key];
    // do stuff
    panels.Remove(min);
}