【问题标题】:OrderBy().ThenBy() wrong outputOrderBy().ThenBy() 错误输出
【发布时间】:2014-02-04 21:39:16
【问题描述】:

我有一个包含 50 个元素的点列表,我想对它们进行排序,所以我使用 orderby thenby to,但我的输出似乎是错误的。第一个元素被相应地排序,但接下来的元素是错误的,这是一个屏幕截图。

正确排序的前五个数据应该是其他数据。但接下来的不是。不知道是什么问题。

所以接下来的五个输出一定是:

{X=249, Y=198}

{X=249, Y=308}

{X=249, Y=413}

{X=249, Y=519}

{X=249, Y=629}

我的列表是一个 PointF 列表:

List<PointF> points = new List<PointF>();

这是我的代码:

points = points.OrderBy(c => c.X).ThenBy(c => c.Y).ToList();

【问题讨论】:

  • 我怀疑您的 X 值不准确。例如,您可能在不同的点上有 X=249 和 X=249.00000001。尝试修改代码为OrderBy(c=&gt;Math.Floor(c.X)).ThenBy(c=&gt;c.Y)
  • @Zruty:非常合理;您应该将其发布为答案!
  • @Zruty 你的回答为我提供了正确的输出,我不明白为什么。谢谢zruty! +1
  • 我也得到了错误的输出,正如我在你的回答中所说的那样。

标签: c# linq list sorting point


【解决方案1】:

请确认您的积分的 X 值确实相等。我假设249249.000001 都可能在列表框中呈现为“249”,但出于排序目的将不相等。

我建议将您的代码更改为

points = points.OrderBy(c => Math.Round(c.X)).ThenBy(c => c.Y).ToList();

看看问题是否消失了。

更新:如果您的坐标预计为非整数,请切换到与指定精度进行比较:

var precision = 0.001; // choose the value that suits you. If the tow values are different by less than this amount, the values are considered equal.
points = points.OrderBy(c => Math.Round(c.X / precision)).ThenBy(c => c.Y).ToList();

此外,您可以使用(int)c.X,而不是使用Round(c.X),因为您的cmets 表明这是您将值输出到列表框的方式。

【讨论】:

  • 我试过那个方法,但我给出了错误的结果。因为,例如,如果有 x = 249 , y=360 和 x = 249.6 , y = 180。第二个 x 坐标将四舍五入为 250。所以在排序时它将是 {X=250, Y=160}然后 {X=249, Y=360}
  • 嘿@Zruty,你的解决方案给了我正确的答案。太感谢了。但我不清楚它是如何工作的,我知道精确度就像一个阈值之类的东西?
  • 这是因为浮点值没有精确表示。因此,例如,0.1*0.1 不等于 0.01。这就是为什么比较浮点值的相等性并不总是有效的原因,通常使用不同的形式来代替a==bMath.Abs(a-b) &lt; very_small_number。有关更多信息,请从 wiki 链接开始:en.wikipedia.org/wiki/Floating_point#Accuracy_problems
猜你喜欢
  • 2020-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-04
  • 1970-01-01
  • 2019-11-27
相关资源
最近更新 更多