gpt4 book ai didi

c# - Linq - 按几个包含的属性对对象列表进行排序

转载 作者:行者123 更新时间:2023-11-30 18:31:56 24 4
gpt4 key购买 nike

* 已解决 - 在底部更新了工单 *

我有一个“线”对象列表,每个对象都有一个“起点”和一个“终点”属性。这些属性包含标准点对象,每个对象都有一个“X”、“Y”和“Z”组件。

使用 Linq,我试图首先通过升序任一端点的最小 Y 值,然后升序任一端点的最小 X 值(当 Y 值匹配时)对我的列表进行排序。

我认为以下方法可行:

var sortedList = linesList
.OrderBy(o => Math.Min(o.StartPoint.Y, o.EndPoint.Y))
.ThenBy(o => Math.Min(o.StartPoint.X, o.EndPoint.X));

foreach (Line thisLine in sortedList)
{
Console.WriteLine(thisLine.StartPoint + ", " + thisLine.EndPoint);
}

但是,这会产生这个顺序(写为 xs、ys、zs、xe、ye、ze):

737.928, 825.293, 0, 737.928, 826.293, 0
737.616, 825.293, 0, 737.616, 826.293, 0
733.928, 825.293, 0, 733.928, 826.293, 0
733.616, 825.293, 0, 733.616, 826.293, 0
729.928, 825.293, 0, 729.928, 826.293, 0
729.616, 825.293, 0, 729.616, 826.293, 0
725.928, 825.293, 0, 725.928, 826.293, 0
725.616, 825.293, 0, 725.616, 826.293, 0
721.928, 825.293, 0, 721.928, 826.293, 0
721.616, 825.293, 0, 721.616, 826.293, 0
717.928, 825.293, 0, 717.928, 826.293, 0
717.616, 825.293, 0, 717.616, 826.293, 0
713.928, 825.293, 0, 713.928, 826.293, 0
713.616, 825.293, 0, 713.616, 826.293, 0
709.928, 825.293, 0, 709.928, 826.293, 0
709.616, 825.293, 0, 709.616, 826.293, 0
705.928, 825.293, 0, 705.928, 826.293, 0
705.616, 825.293, 0, 705.616, 826.293, 0
701.928, 825.293, 0, 701.928, 826.293, 0
701.616, 825.293, 0, 701.616, 826.293, 0
697.928, 825.293, 0, 697.928, 826.293, 0
697.616, 825.293, 0, 697.616, 826.293, 0
693.928, 825.293, 0, 693.928, 826.293, 0
693.616, 825.293, 0, 693.616, 826.293, 0
689.928, 825.293, 0, 689.928, 826.293, 0
689.616, 825.293, 0, 689.616, 826.293, 0
685.928, 825.293, 0, 685.928, 826.293, 0
685.616, 825.293, 0, 685.616, 826.293, 0
681.928, 825.293, 0, 681.928, 826.293, 0
681.616, 825.293, 0, 681.616, 826.293, 0
677.928, 825.293, 0, 677.928, 826.293, 0
677.616, 825.293, 0, 677.616, 826.293, 0
673.928, 825.293, 0, 673.928, 826.293, 0
673.616, 825.293, 0, 673.616, 826.293, 0
669.928, 825.293, 0, 669.928, 826.293, 0
669.616, 825.293, 0, 669.616, 826.293, 0
737.928, 826.481, 0, 737.928, 827.481, 0
737.616, 826.481, 0, 737.616, 827.481, 0
733.928, 826.481, 0, 733.928, 827.481, 0
733.616, 826.481, 0, 733.616, 827.481, 0
729.928, 826.481, 0, 729.928, 827.481, 0
729.616, 826.481, 0, 729.616, 827.481, 0
.
.
.

如您所见,“Y”值正确上升,但“X”值下降。

* 更新 **

在评论部分,提出了OrderBy比较器中典型的浮点公差问题的可能性。作为快速测试,我将 .OrderBy 子句更改为:

.OrderBy(o => Math.Min(Math.Round(o.StartPoint.Y, 3), Math.Round(o.EndPoint.Y, 3)))

它很丑,但它解决了排序问题。显然,没有一个“Y”值被视为相等。现在我已经强制它们四舍五入到 3 个位置,值确实 确实 匹配并且执行 ThenBy 子句以按“X”值排序。

现在,强制匹配的更好方法是什么?编写我自己的比较器?

最佳答案

我将回答更新后的问题:

如果你想在不修改实际值的情况下根据四舍五入的值对订单进行自定义比较,你可以实现 IComparer<T> .然后使用 overload of OrderBy<T> 这需要一个 IComparer。

public class NonExactLineComparer : IComparer<Line>
{
public int Compare(Line x, Line y)
{
// Comparison logic
}
}

关于c# - Linq - 按几个包含的属性对对象列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19282680/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com