C# - 字典 - 如何在字典中获取特定类值的最大值? [复制]

Posted

技术标签:

【中文标题】C# - 字典 - 如何在字典中获取特定类值的最大值? [复制]【英文标题】:C# - dictionary - How to get max of specific class value in dictionary? [duplicate] 【发布时间】:2020-08-11 23:00:58 【问题描述】:

我有一本字典,我试图在其中查找特定类值的最大值,类似于获取列表的最大值。我已经搜索了几个小时,但我发现的只是如何从具有键和单个值的字典中获取值。我也遇到过 Linq,但我没有找到任何关于如何在字典的类值中搜索 Max 值的信息。我很确定有办法,但我只是错过了什么?

就我而言,我正在尝试找到我班级 LineInfo 的 Max lineDistance

我找到的链接很接近

this one 但它只处理一个键和一个值,而不是一个类

this one 似乎它可能在正确的轨道上,但检查的答案建议运行嵌套的 foreach。我想有一个更简单/更复杂的方法吗?

感谢任何和所有的帮助。

这是我的代码,相当简单:

class LineInfo
    
        public double lineDistance  get; set; 
        public LineSegment2d lineSegment2D1  get; set; 
        public LineSegment2d lineSegment2D2  get; set; 
    

var lines = new Dictionary<int, LineInfo>();

double pointDistance0 = lineSegment2DList[i].StartPoint.GetDistanceTo(lineSegment2DList[j].StartPoint);
lines.Add(0, new LineInfo lineDistance = pointDistance0, lineSegment2D1 = lineSegment2DList[i], lineSegment2D2 = lineSegment2DList[j] );

double pointDistance1 = lineSegment2DList[i].StartPoint.GetDistanceTo(lineSegment2DList[j].EndPoint);
lines.Add(1, new LineInfo  lineDistance = pointDistance1, lineSegment2D1 = lineSegment2DList[i], lineSegment2D2 = lineSegment2DList[j] );

double pointDistance2 = lineSegment2DList[i].EndPoint.GetDistanceTo(lineSegment2DList[j].StartPoint);
lines.Add(2, new LineInfo  lineDistance = pointDistance2, lineSegment2D1 = lineSegment2DList[i], lineSegment2D2 = lineSegment2DList[j] );


double pointDistance3 = lineSegment2DList[i].EndPoint.GetDistanceTo(lineSegment2DList[j].EndPoint);
lines.Add(3, new LineInfo  lineDistance = pointDistance3, lineSegment2D1 = lineSegment2DList[i], lineSegment2D2 = lineSegment2DList[j] );


【问题讨论】:

所以您只想要字典中lineDistance 最大的LineInfovar result = lines.Values.OrderByDescending(line =&gt; line.lineDistance).First(); 为什么这些东西存储在字典中?一个数组就足够了? @itsme86 如果你想发表你的评论作为答案,我会检查它,因为你是第一个。 MoreLinq 的 MaxBy 可能是您想要的。 【参考方案1】:

要获得最大lineDistanceLineInfo,您可以使用Values 集合。由于标准 LINQ 中没有 MaxBy,您可以使用 Aggregate 实现类似的效果:

var max = lines.Values
    .Aggregate((acc, curr) => acc.lineDistance > curr.lineDistance ? acc: curr);

【讨论】:

这与 OP 提到的已接受的answer 有何不同? @PavelAnikhouski,我不知道如何访问我班级中的特定字段 lineDistance 值。大师的回答让我可以这样做。【参考方案2】:

如果我正确理解了这个问题,那么 Linq 中的 Max 有一个重载,它允许您指定一个属性,即:

double max = lines.Max(x => x.Value.lineDistance);

编辑

如果你想要这个对象,@itsme86 解决方案效果最好:

LineInfo maxLineInfo = lines.Values.OrderByDescending(line => line.lineDistance).First();

【讨论】:

是的,但这只会返回最大 lineDistance 值,而不是最大 lineDistance 值的对象。也许这就是OP所追求的。有点不清楚。 @itsme86 啊,我没有意识到,我添加了您的解决方案并感谢您,因为它是最简单的解决方案。 @itsme86 没有发布OrderBy 评论作为答案的原因是因为在概念上找到“Max by”的方法是错误的 - 普通开发人员很难建议 O(n log n) 答案何时O(n) 很容易实现 - bing.com/search?q=c%23+max+by+propery - ***.com/questions/914109/…

以上是关于C# - 字典 - 如何在字典中获取特定类值的最大值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

具有多个值的C#字典如何[重复]

Swift字典获取值的关键

如何制作包含特定值的 Swift 字典?

如何使用swift获取字典中的索引值

如何找到字典中每个键的最小值/最大值?以及如何找到每个键的值的数量?

搜索特定值的嵌套字典列表[重复]