2010-11-13 115 views
1

排序中按X降序排列,然後Y.如何使用C#對2D點列表進行排序?

+4

如果你正在尋找一些幫助,你曾嘗試過什麼?你寫了哪些代碼不起作用? – 2010-11-13 11:55:49

+5

這不是人們爲你做作業的地方 – 2010-11-13 11:55:50

+0

定義點的順序如何?先x再y,距離原點的距離,...? – Rauhotz 2010-11-13 12:12:43

回答

10
list.Sort((a,b)=>{ 
    int result = a.X.CompareTo(b.X); 
    if(result==0) result = a.Y.CompareTo(b.Y); 
    return result; 
}); 
1
List<Point> sortedList = MyList.Sort(
    delegate(Point p1, Point p2) 
    { 
     int r = p1.x.CompareTo(p2.x); 
     if(r.Equals(0)) return p1.y.CompareTo(p2.y); 
     else return r; 
    } 
); 
+0

只能按x排序,而不能先按x然後按y – CodesInChaos 2010-11-13 12:02:18

+0

@CodeInChaos you right - fixed! – UGEEN 2010-11-13 12:11:56

0

如果評論者確實是正確的,而你正在尋找一個解決一個問題的功課,我懷疑點的列表真正的任務是教你如何對整數值進行排序。所以我會幫助你開始。

提示:Point structure有兩個屬性,你可能會發現有用的,XY,其分別返回座標值這兩個軸。

0

有很多方法來排序列表。

例如,排序列表從最小的(X,Y)到最大,你可以試試這個算法:

  1. 列表與第二
  2. 比較的第一個項目如果第二點是小於第一個(x1 > x2 || (x1 == x2 && y1 > y2))然後交換它們
  3. 比較第二個點和第三個以相同的方式,依此類推,直到您到達列表的末尾
  4. 回到列表的開頭並運行再次比較,直到最後一個元素
  5. 重複步驟4,但較早每次停止一個元素,直到你有沒有留下元素進行排序

這是一個低效率的算法,但它會完成這項工作。

爲了更好的算法,看看http://www.sorting-algorithms.com/

6

的另一種方式馬克Gravell's答案(這將排序列表本身),你在哪裏得到它可以製成一個清單,.ToList()IEnumerable<T>是LINQ語法:

var ordered = from v in yourList 
       orderby v.X, v.Y 
       select v; 

var orderedList = ordered.ToList(); 

但除非你不想竟排序列表本身或者你只需​​要,比方說一個IEnumerableList.Sort會更好。

+0

對於上述案例,LINQ看起來頗爲「時髦」,因爲它很簡單 - 也許它會非常高效。 – UGEEN 2010-11-13 12:15:06

+2

我相信'List.Sort'會更高效一些,但是我不確定,無論如何也沒關係:)但是,應該指出,這兩種解決方案在語義上並不相同(即使'yourList = *使用yourList * .ToList()'查詢),因爲其他人可能會引用舊列表。 – 2010-11-13 12:18:53