속성 순위가있는 개체의 목록이 있습니다. 이것은 정수입니다.어떻게 정렬 할 수 있지만 하단에 0을 넣을 수 있습니까?
내가보기에 순위를 기준으로 정렬하고 싶지만 내가 할 때 :
myObjects = myObjects.Orderby(r=>r.Rank);
내가
내가 원하는 (이이 상단에 설정되지 않은 의미)이 제로의 모두를 얻을 수 1 -> n으로 주문하고 0을 목록 하단에 표시하십시오. 목록
속성 순위가있는 개체의 목록이 있습니다. 이것은 정수입니다.어떻게 정렬 할 수 있지만 하단에 0을 넣을 수 있습니까?
내가보기에 순위를 기준으로 정렬하고 싶지만 내가 할 때 :
myObjects = myObjects.Orderby(r=>r.Rank);
내가
내가 원하는 (이이 상단에 설정되지 않은 의미)이 제로의 모두를 얻을 수 1 -> n으로 주문하고 0을 목록 하단에 표시하십시오. 목록
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
와 함께 첫 번째 람다를 교체 할 수 있습니다.
사용자 지정 비교 자 (구현 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을 사용하는 방법의 간단한 예 : 다루는
두 가지 유형을 모두 수행하지 않고도 더 좋은 방법이 있습니까? – leora
@leora : 자세한 내용은 http://msmvps.com/blogs/jon_skeet/archive/2011/01/04/reimplementing-linq-to-objects-part-26a-iorderedenumerable.aspx (및 이후 게시물)를 참조하십시오. –
@leora : 이것은 두 가지 종류가 아닙니다. "OrderBy/ThenBy"는 꽤 영리합니다. 쿼리 표현식의 결과는 쿼리 결과 * 계산이 아닌 * 쿼리 *입니다. 쿼리가 실행될 때 쿼리는 OrderBy 다음에 ThenBy가 있는지 여부를 확인합니다. –