[英]Linq - Sort list of objects by several contained properties
*已解決 - 機票在底部更新*
我有一個“行”對象列表,每個對象都有一個“StartPoint”和一個“EndPoint”屬性。 這些屬性包含標准點對象,每個對象都帶有“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>
。 然后使用帶有IComparer 的OrderBy<T>
的重載 。
public class NonExactLineComparer : IComparer<Line>
{
public int Compare(Line x, Line y)
{
// Comparison logic
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.