2013-12-12 3 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); 

나는 C#에서 그렇게 어떻게 t.X

에 의해 목록 tocke을 정렬하려면?

답변

3

사용 LINQ :

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

t 공개합니다.

1

LINQ가없는 직접 솔루션 (목록 정렬 만, 추가 목록 생성 없음).

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의 나쁜 경우는 피할 수 있습니다. ;) BTW 나는 값이 + ve, -ve 또는 0 일 필요가 있기 때문에 단지'(other.t.X - t.X)'를 반환함으로써 비교를 단순화 할 수 있다고 생각한다. –

0

당신은이 같은 예를 들어 LINQ를 사용할 수 있습니다 :

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

그러나 먼저 당신은 적어도 그것을 가져올 때, t을 공개해야한다 : 모든

public Point t { get; private set; } 
0
  • 먼저 당신이 당신의 클래스에 public 수정을 추가해야합니다.
  • 두 번째로 필드를 속성으로 리팩터링해야합니다. 필드를 대중에게 공개하는 것이 좋습니다.

당신은 Linq

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

주를 사용해야한다 귀하의 질문에 대한 대답으로

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

을 follwos 그런 다음 솔루션은 다음과 같습니다 그렇지 않으면 그냥 그 점은 결코 null인지 확인 할 것을 Linq-Query 위의 목록은 작동하지 않습니다.

0

사용하여 N-장소 :

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

또는 LINQ를 사용하여가 (새로운 목록을 만듭니다) :

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

당신은 아마 속성으로 t을 캡슐화한다. 또한 tnull 일 수있는 경우 위 람다에 무효 확인을 추가해야합니다.