2012-01-27 2 views
14

에서 중첩 된 목록은 내가 중첩 된 목록, 내가 좋아하는 것 있는 OrderBy/ThenBy 루핑 - C#을

List<List<String>> intable; 

모든 열을 정렬 할 수 있습니다. 문제는 열의 수가 사용자 입력에 달려 있다는 것입니다.

var tmp = intable.OrderBy(x => x[0]); 
for (int i = 1; i <= 3; i++) 
{ 
     tmp = tmp.ThenBy(x => x[i]); 
} 
intable = tmp.ToList(); 

그것은 더 이상 작품이 내가 루프에 넣을 때처럼,

var tmp = intable.OrderBy(x => x[0]); 
tmp = tmp.ThenBy(x => x[1]); 
tmp = tmp.ThenBy(x => x[2]); 
tmp = tmp.ThenBy(x => x[3]); 
intable = tmp.ToList(); 

그러나 (이 예를 들어, 4 열을 가정) 잘 작동처럼

목록 정렬 올바르게 입력하고 네 번째 열만 정렬합니다.

+1

같은 목록을 비교 자 다음

class StringListComparer : IComparer<List<string>> { public int Compare(List<string> x, List<string> y) { int minLength = Math.Min(x.Count, y.Count); for (int i = 0; i < minLength; i++) { int comp = x[i].CompareTo(y[i]); if (comp != 0) { return comp; } } return x.Count.CompareTo(y.Count); } } 

작성이 [http://social.msdn.microsoft .com/forums/ko-ko/linqprojectgeneral/thread/61e502b4-6795-4e51-b70e-2be642cfc413 /] (http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/61e502b4-6795) -4e51-b70e-2be642cfc413 /) –

답변

24

이것은 수정 된 폐쇄의 경우입니다. 이에 코드를 변경하고 그것은 작동합니다

var tmp = intable.OrderBy(x => x[0]); 
for (int i = 1; i <= 3; i++) { 
    var thisI = i; 
    tmp = tmp.ThenBy(x => x[thisI]); 
} 
intable = tmp.ToList(); 

에릭 Lippert의 문제를 설명하는 two-part article 작성했습니다. LINQ가 ToList()을 호출 할 때 평가 될 때 LINQ가 마지막 값인 i 만 사용하기 때문에 예상대로 작동하지 않는 이유는 간단합니다. 그것은 당신이 쓴 것과 동일합니다 :

var tmp = intable.OrderBy(x => x[0]); 
tmp = tmp.ThenBy(x => x[3]); 
tmp = tmp.ThenBy(x => x[3]); 
tmp = tmp.ThenBy(x => x[3]); 
intable = tmp.ToList(); 
+5

에릭 리 퍼트 (Eric Lippert)는 폐쇄 행동 C# 5에서 변경 될 것입니다. [SO Link Here] (http://stackoverflow.com/a/8899347/498969) –

+6

@AdamSpicer : "for"루프, "foreach"루프 만 변경되지 않습니다. –

+0

@EricLippert, 설명 주셔서 감사합니다! –

0

참조 정렬이

intable.Sort(new StringListComparer());