簡體   English   中英

Linq - 按幾個包含的屬性對對象列表進行排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM