2013-06-02 6 views
1

나는 x와 y 값이 클래스 A의 목록을 가지고 :정렬 목록

class A 
{ 
    public int X { get; set; } 
    public int Y { get; set; } 
} 

마이리스트 : 나는 A의 계산 값을 기준으로 목록을 정렬 할

List<A> MyList = GetListOfA(); 

재산. 예를 들어 X로 배율이 적용된 오늘의 환율입니다. OrderBy 표현식을 사용하면 메소드는 x * log (x) 회 계산됩니다.

값과 변수가 포함 된 내부 클래스 생성, 변수 및 계산 값 목록이 포함 된 익명 유형 목록 생성, 계산 된 값의 키 별 정렬 사전에 추가하는 것과 같은 몇 가지 방법을 찾았습니다. 가치 등.

깨끗하고 간단한 구문으로 최선의 방법은 무엇입니까?

+1

배가. 곱셈을하지 않고 원래의 값으로 정렬하지 않는 이유는 무엇입니까? –

+0

비율이 양수가 아니더라도 정렬 된 순서가 반대로됩니다. –

답변

5

OrderBy 표현식을 사용하면 메소드는 x * log (x) 회 계산됩니다.

아니요. LINQ to Objects에서 OrderBy은 각 요소를 순서 키에 한 번만 투영 한 다음 해당 키를 비교합니다. 크기가 n 인 컬렉션의 경우 속성에 대한 액세스는 n이고 해당 속성 값 간의 O (n log n) 비교가 있습니다.

기본적으로 OrderBy을 사용하여 최대한 간단하게 코드를 작성하고 합리적으로 효율적이라고 믿습니다.

+0

고마워요! 효과가 있습니다. – user436862

+0

절대적으로 맞습니다! 이 동작은 더 명확하게 문서화 될 수 있습니다. 나는 원래 포스터가 LINQ'OrderBy' 상황을'Array'와'List <>'의'Sort' 메쏘드와 혼동하여'Comparison <>' 델리게이트를 지정할 수 있다고 생각합니다. 예제에서와 같이 myList.Sort ((x, y) => ExpensiveMethod (x, y, otherArgs))'. 이 경우'List <> '에 카운트가'n '이면 대리자가'n '번 이상 호출되어야합니다. 그러나 그것은 다른 상황입니다. –

+0

@JeppeStigNielsen : LINQ를 둘러싼 다양한 것들이 그렇듯이 분명히 더 명확하게 문서화 될 수 있습니다. (일부 문서는 틀렸어 ...) –

0

나는 당신이 itelf로 목록을 변경하지 말 것을 권하고 싶습니다. 불변으로 취급하십시오.

모든 작업이 이루어지는이 목록 (보기와 같은)의 사본을 보관하십시오.

새로운 클래스로 모두 캡슐화합니다.

나는 이렇게 할 것이다.

2

당신은 IComparer<T> 인터페이스를 사용할 수 있습니다

class A 
{ 
    public int X { get; set; } 
    public int Y { get; set; } 
} 

class AComparer : IComparer<A> 
{ 
    public int Compare(A x, A y) 
    { 
     var fx = F(x); 
     var fy = F(y); 

     if (fx < fy) return -1; 
     if (fx == fy) return 0; 
     return 1; 
    } 

    double F(A a) // your calculation 
    { 
     return a.X * 1.2; 
    } 
} 

그리고 코드에서

: (속도가 아닌 긍정적 인 경우를 제외하고) 순서를 변경하지 않는 속도로

var list = new List<A>(); 
// fill list 
list = list.OrderBy(a => a, new AComparer()).ToList();