2013-05-22 4 views
6

속성 순위가있는 개체의 목록이 있습니다. 이것은 정수입니다.어떻게 정렬 할 수 있지만 하단에 0을 넣을 수 있습니까?

내가보기에 순위를 기준으로 정렬하고 싶지만 내가 할 때 :

myObjects = myObjects.Orderby(r=>r.Rank); 

내가

내가 원하는 (이이 상단에 설정되지 않은 의미)이 제로의 모두를 얻을 수 1 -> n으로 주문하고 0을 목록 하단에 표시하십시오. 목록

답변

18

LINQ 매우 긴으로

나는 그것이 효율적으로 가능한 일종의 싶습니다

myObjects = myObjects 
    .OrderBy(r => r.Rank == 0) //false before true 
    .ThenBy(r => r.Rank); 

하지 않습니다 실제로이 모든 종류의 작업을 수행. 두 개의 람다를 결합하여 사전 정렬 두 개의 키에 걸쳐 정렬합니다. false -before- true 규칙이 정말 중복 보일 수 있습니다 알고 있지만 - 당신이 그리 명확 false -before- true 규칙 편안하지 않은 경우

, 당신은 r => r.Rank == 0 ? 1 : 0와 함께 첫 번째 람다를 교체 할 수 있습니다.

+0

두 가지 유형을 모두 수행하지 않고도 더 좋은 방법이 있습니까? – leora

+0

@leora : 자세한 내용은 http://msmvps.com/blogs/jon_skeet/archive/2011/01/04/reimplementing-linq-to-objects-part-26a-iorderedenumerable.aspx (및 이후 게시물)를 참조하십시오. –

+2

@leora : 이것은 두 가지 종류가 아닙니다. "OrderBy/ThenBy"는 꽤 영리합니다. 쿼리 표현식의 결과는 쿼리 결과 * 계산이 아닌 * 쿼리 *입니다. 쿼리가 실행될 때 쿼리는 OrderBy 다음에 ThenBy가 있는지 여부를 확인합니다. –

6

사용자 지정 비교 자 (구현 IComparer)를 만들고 맨 아래에 0을 정렬 할 수 있습니다. 그런 다음

public class ZeroComparer : IComparer { 
    public int Compare(Object intA, Object intB) { 
     if(intA == 0 && intB != 0) 
      return -1; 
     if(intA != 0 && intB == 0) 
      return 1; 
     return int.Compare(intA, intB); 
    } 
} 

처럼 사용 : 의사 코드는 것

var comparer = new ZeroComparer(); 
myObjects = myObjects.Orderby(r=>r.Rank, comparer); 

사용자 정의 comparers을 사용하는 방법의 간단한 예 : 다루는

Use own IComparer<T> with Linq OrderBy

1
myObjects = myObjects.Orderby(r => r.Rank == 0 ? int.MaxValue : r.Rank); 

케이스 Rank == int.MaxValue :

myObjects = myObjects.Orderby(r => r.Rank == 0 ? int.MaxValue : r.Rank - 1); 
+1

만약'int.MaxValue'는'Rank'에 유효한 값입니까? – svick

+1

좋은 말입니다. 그래서 우리는 order 절에서 '1'을 가져야합니다. 시드 편집 된 질문. – polkduran

관련 문제