2010-05-08 43 views
2

我想排序一個2D點的列表,首先由x座標,然後由y座標。 我實現IComparer接口如下:排序一個二維積分列表(首先由X,然後是Y)

class PointComparer : IComparer<Point> 
{ 
    public int Compare(Point x, Point y) 
    { 
     if (x.Y != y.Y) 
     { 
      return x.Y - y.Y; 
     } 
     else 
     { 
      return x.X - y.X; 
     } 

    } 
} 

然後打電話給我的排序如下:

pointsList.Sort(new PointComparer()); 

出於某種原因列表不排序。當然是一件很簡單的和愚蠢的,但停留在這個相當長的一段.... TIA

+0

爲什麼你比較有''IntPoint' Point'? – kennytm 2010-05-08 15:06:16

+0

對不起,這是一個錯誤。糾正。 – Mikos 2010-05-08 15:07:54

+4

不是按Y排序,然後按X排序?另外,在這種情況下,'x'和'y'是可怕的名字。 – Kobi 2010-05-08 15:08:46

回答

6

這應該更好地工作:

class PointComparer : IComparer<Point> 
{ 
    public int Compare(Point first, Point second) 
    { 
    if (first.X == second.X) 
    { 
     return first.Y - second.Y; 
    } 
    else 
    { 
     return first.X - second.X; 
    } 

    } 
} 

如果X值是不同的,它會使用Y值進行排序。這與您的代碼不同,如果Y值相同,將使用X值。

正如其他人所提到的,如果你可以使用LINQ,你應該使用OrderByThenBy擴展方法:

pointsList.OrderBy(p => p.X).ThenBy(p => p.y) 
+0

Thx。但沒有運氣,原始訂單保持不變。 – Mikos 2010-05-08 15:16:55

+3

這和他的幾乎一樣,除了你的打字錯誤「first.X == first.X」...這總是如此,所以其他人永遠不會碰到 – 2010-05-08 15:18:13

+0

thx @miky,就這麼做!唷! – Mikos 2010-05-08 15:21:17

0

爲什麼不:

var sorted = pointsList.OrderBy(p => p.X) 
         .ThenBy(p => p.y) 
+0

雖然這應該起作用,但這不是OP要求的。他想知道他在做什麼錯誤(即爲什麼使用比較器不工作) – 2010-05-08 15:21:13

相關問題