2011-05-10 6 views
2

나는 clusters라는 목록을 가지고 있으며 그 목록에는 sequenceno가있는 tags라는 또 다른 목록이 있습니다.다음 목록을 어떻게 정렬합니까?

한 줄에 람다 식을 사용하여 각 클러스터의 태그에서 최대 seuqenceno를 사용하여 클러스터를 정렬하는 방법은 무엇입니까?

뭔가

같은
clusters.Sort((a,b) => a.tags...... 
+2

는 비즈니스 요구 사항의 "한 줄에"어떤 종류인가? –

답변

7

없는 매우 효율적인 솔루션 (O는 (N N) 최대 값을 기록 계산하지만, 현재 위치에서 실행) :

clusters.Sort((a,b) => a.tags.Max(x => x.sequenceno) 
         .CompareTo(b.tags.Max(x => x.sequenceno))); 

다소 더 나은 솔루션 (만 O를 계산 (N) 최대 값이지만 실제 작동하지 않습니다.) :

var max = clusters.ConvertAll(c => c.tags.Max(x => x.sequenceno); 
clusters = clusters.Select((x,i) => new{x,i}) 
        .OrderBy(xi => max[xi.i].CompareTo(max[xi.j])) 
        .Select(xi => xi.x) 
        .ToList(); 

이 정렬을 내부에서 효율적으로 수행하는 것은 어려울 것입니다 없이

  1. 태그의 최대 시퀀스 번호를 캐시하기 위해 속성을 추가합니다 (가능한 경우 무효화 처리).
  2. 인덱스를 추적하기 위해 클러스터 클래스에 속성을 추가합니다 (여기서는 의미가 없거나 무효화 문제가 발생할 수 있음).
  3. 1 및 2에서 언급 한 값을 추적하는 클러스터 주위의 래퍼 목록을 사용합니다.
  4. 고유 한 정렬 알고리즘 롤링. LINQ있는 OrderBy를 사용하여
+0

사실이지만 최적화하기 전에 실제로 성능 문제가 있는지 확인하십시오. 태그 목록이 너무 크지 않으면 방해하지 않을 것입니다. – jeroenh

+0

유효성 검사 문제가 이미 처리되었으므로 적절한 솔루션이 효과적입니다. 또한 태그 목록은 아주 작습니다. 감사! – RemoteSojourner

+0

@ 제론 : 맞아. 나는 비효율적 인 부분이 무엇인지 구체적으로 언급했고, 결정을 내리는 것이 얼마나 쉽게 비효율적 이었는지를 언급했다. –

3

:

var orderedClusters = clusters.OrderBy(list => list.Max(item => item.SequenceNo)) 
+0

@downvoter는 설명을 신경 써야하나요? – jeroenh

관련 문제