2011-08-02 3 views
0

나는 컬렉션이 있으며 그 중 모두는 int TypeId 속성을가집니다. 이 컬렉션의 항목을 재정렬해야합니다 (또는 새로 가져 오기). 항목의 순서는 TypeId = 3이고 그 다음은 TypeId = 1이고 그 다음은 TypeId = 2입니다.
내 솔루션은 다음과 같습니다컬렉션 맞춤 재주문

궁금
var result = new List<A>(); 
result.AddRange(source.Where(i => i.TypeId == 3)); 
result.AddRange(source.Where(i => i.TypeId == 1)); 
result.AddRange(source.Where(i => i.TypeId == 2)); 

, 어떤은 source 콜렉션 여러 반복하는없이 다른 빠른 해결책 (일부 LINQ 트릭 일 수 있음)이있다?

+0

귀하의 목록은 어떤 유형의 컬렉션입니까? 일부 콜렉션 클래스에는 내장형 정렬 함수가있어 매우 빠르다. 일반적으로 QuickSort가 선호되는 방법입니다 (Where 함수의 속도에 따라)이 메서드는 매우 효율적으로 보입니다. –

+1

@Nick Udell : 자연의 질서를 정렬 할 때 사용하는 것과 같은 동일한 필드별로 정렬하는 트릭입니다. 그래서 이것은 표준 정렬 알고리즘 – sll

답변

3

단순히 순서 배열을 만들고 색인을 요청하여 OrderBy 문에서 사용할 수 있습니다. 다음은 의사 로직 (또 다른 컬렉션 형식을 사용하지 않을 경우 내가 같이 IndexOf 네이티브 배열을 사용할 수있는 경우 기억할 수는 없지만)

int[] order = new int[] { 3, 1, 2}; 
    source.OrderBy(i => Array.IndexOf(order, i.TypeId)); 

- 그것은 컴파일 할 수 있도록 루크의 의견에 따라 예를 들어 편집 정확하게

+0

+1에 대한 작업이 아니라고 생각하지만,'order.IndexOf (i.TypeId) '대신에 정적'Array.IndexOf (order, i.TypeId)'를 사용해야합니다. – LukeH

+0

추가하기에 좋습니다. 보다 정확하도록 답변을 편집합니다 –

+0

그리고 새 시퀀스를 반환하는 대신 전체 정렬을 원한다면 다음을 수행하십시오.'source.Sort ((x, y) => Array.IndexOf (order, x.TypeId) .CompareTo (Array.IndexOf (order, y.TypeId)));' – LukeH