2013-12-12 153 views
2

我想排序類對象的列表。c中類對象的排序列表#

class tocka 
{ 
Point t; 
double kut; 
int redkotiranja; 

public tocka(Point _t, double _kut, int _redkotiranja) 
{ 
t = _t; 
kut = _kut; 
redkotiranja = _redkotiranja; 
} 
} 

下面的列表:

List<tocka> tocke= new List<tocka>(); 
tocka a = new tocka(new Point(0, 1), 10, 1); 
tocke.Add(a); 
tocka b = new tocka(new Point(5, 1), 10, 1); 
tocke.Add(b); 
tocka c = new tocka(new Point(2, 1), 10, 1); 
tocke.Add(c); 
tocka d = new tocka(new Point(1, 1), 10, 1); 
tocke.Add(d); 
tocka ee = new tocka(new Point(9, 1), 10, 1); 
tocke.Add(ee); 

我想t.X

我如何在C#中對列表進行排序tocke

回答

3

使用LINQ:

tocke = tocke.OrderBy(x=> x.t.X).ToList(); 

t公衆。沒有LINQ(只是列表排序,沒有額外的列表創建)

1

直接的解決方案。

提供t公之於衆:

tocke.Sort((left, right) => left.t.X - right.t.X); 

但是,最好的辦法,恕我直言,是讓class tocka可比

class tocka: IComparable<tocka> { 
    ... 

    public int Compare(tocka other) { 
    if (Object.RefrenceEquals(other, this)) 
     return 0; 
    else if (Object.RefrenceEquals(other, null)) 
     return 1; 

    return t.X - other.t.X; // <- Matthew Watson's idea 
    } 
} 

// So you can sort the list by Sort: 

tocke.Sort(); 
+0

+1提供的答案不會將列表複製到另一個集合中,對它進行排序,然後將其複製回另一個列表中 - 從而避免出現LINQitis的不利情況。 ;)順便說一句,我認爲你可以通過返回'(other.t.X - t.X)'來簡化比較,因爲該值只需要+ ve,-ve或0。 –

0

您可以使用LINQ,比如像這樣:

tocke.Sort((x,y) => x.t.X.CompareTo(y.t.X)); 

但首先你必須做出t公衆,至少獲得時:

所有的
public Point t { get; private set; } 
0
  • 首先,你應該在public改性劑添加到您的類。
  • 其次你應該重構你的領域的屬性。建議向公衆公開財產而非領域。

那麼解決辦法是爲follwos

public class Tocka 
{ 
    public Point Point { get; private set; } 
} 

至於回答你的問題,你應該使用Linq

List<Tocka> l = ... 
var orderedTocka = l.OrderBy(i => i.Point.X); 

注:只是要確保的一點是從來沒有null,否則Linq-Query上面列出的將無法正常工作

0

您可以按照我用正地點:

tocke.Sort((a, b) => a.t.X.CompareTo(b.t.X)); 

或者使用LINQ(創建一個新的列表):

tocke = tocke.OrderBy(x=> x.t.X).ToList(); 

你或許應該封裝t的財產。另外,如果t可以是null,則應該將無效檢查添加到上述lambda表達式。