2012-09-13 85 views
4

我想基於x和y對C#中類的點列表(請參見下文)進行排序。基於兩個值的點類的排序列表C#

public class Point 
{ 
    public int x; 
    public int y; 
    public Point(int xp, int yp) 
    { 
     x = xp; 
     y = yp; 
    } 
} 

你如何做到這一點:我的品牌新的C#,以及是否有任何相似之處的Java與此相比,實施類定製comparitors方法,也是我想補充的比較方法(INT的CompareTo)給班級排序。

在此先感謝。

+0

看看IComparable的。那將是一個很好的起點。 – DarthVader

回答

8

是的,您正在尋找IComparable<T>IComparer<T> - 後者相當於Java中的Comparator<E>接口。

如果你想添加一個相比於Point類本身,使Point實施IComparable<Point>(以及可能的非通用IComparable界面太)。如果你想在其他地方執行比較,則可以創建另一個類IComparer<Point>

對於等於,.NET也有IEquatable<T>IEqualityComparer<T>。這些用於比如Dictionary<,>中的關鍵比較。

作爲一個方面說明,我強烈建議您而不是有公共字段 - 而且您可能希望將變量設置爲readonly。 (不可變類型通常更容易推理。)您也可以決定製作Point a struct,而不是class

+0

我覺得'IEquatable '是更普通的用途,我可以隨時用於平等檢查,而'IEqualityComparer '主要用於'IDictionary '用於重點檢查和衝突等。 – DarthVader

+1

@DarthVader:不,不是。區別僅僅在於是否一個對象負責將*本身*與另一個項目進行比較,或者一個單獨的對象是否可以將另外兩個對象*與其他對象進行比較......與「IComparable」和「IComparer」相同。 –

+0

瞭解。感謝您的澄清。 – DarthVader

3
var points = new List<Point>() { new Point(1,3), new Point(1,4), new Point(1,2) }; 
var sortedPoints = points.OrderBy(point => point.x).ThenBy(point => point.y); 
+0

'List(of Point)'不能在C#中編譯。我認爲你的意思是'List ' –

+0

@BrianRogers Lol。我在工作中做了很多VB和C#之間的切換,我總是這樣做。驚訝我也沒有忘記我的分號。 –

+0

+1感謝您修復它。 –

0

您想在C#中實現的接口是IComparable<T>,它的行爲類似於Java的Comparable。那麼你的代碼變得

public class Point : IComparable<Point> 
{ 
    private int x; 
    private int y; 

    public int X 
    { 
     get { return x; } 
    } 

    public int Y 
    { 
     get { return y; } 
    } 

    public Point(int xp, int yp) 
    { 
     x = xp; 
     y = yp; 
    } 

    public int CompareTo(Point other) 
    { 
     // Custom comparison here 
    } 
} 

注意,我改變了公共領域爲民營領域,改變了面向公衆的界面進入properties。這是比較習慣的C# - 公共字段在Java和C#中都被忽略了。

1

您可以實現IComparable接口,並在此梅索德實施其

public int CompareTo(object obj) 

可以編寫邏輯以比較例如兩個對象:

if (objectA.x > objectB.x) 
    return 1 
else if (objectA.x < objectB.x) 
    return -1 
else // compare y in both objects