2013-10-08 1 views
4

오늘 C#에서 흥미로운 정렬 동작을 발견했습니다. 나는 두 목록을 가지고 있고 내가 그들을 분류 :특정 문화권을 사용하면서 정렬 - "BB"는 "AA"이전에 덴마크어 및 노르웨이어로 나타날 수 있습니다.

var list1 = new List<string> { "A", "B", "C" }; 
var list2 = new List<string> { "AA", "BB", "CC" }; 
list1.Sort(); 
list2.Sort(); 

는 두리스트는 이제 포함 :

>> list1 
[0]: "A" 
[1]: "B" 
[2]: "C" 

>> list2 
[0]: "BB" 
[1]: "CC" 
[2]: "AA" 

왜 결국 AA 넣어입니까? http://ideone.com/QCeUjx

+0

http://en.wikipedia.org/wiki/Aahrus#Aarhus.2F .... 후, 각 캐릭터를 정규화 문자열을 정렬하는 비교 순서를 사용하는 .C3.85rhus_spelling –

답변

5

그것은 내가 덴마크어 문화 설정을 사용하고 있기 때문에, .NET은 "AA"는 덴마크 알파벳의 끝에 덴마크의 문자 "A"이라고 가정 밝혀 : 여기

는 데모입니다.

로케일을 en-US으로 설정하면 예상 한 정렬 순서 ("AA", "BB", "CC")를 얻을 수 있습니다.

This article에는 배경 정보가 있습니다.

+0

응용 프로그램이 실제로 덴마크 플랫폼을 대상으로하기 때문에 "AA"를 "Å"로 정렬하려고한다고 지적해야합니다. – dlebech

0

그래, 현재 로캘 설정은 코드 줄 다음과 같이 변경할 수 있습니다.

var list1 = new List<string> { "A", "B", "C" }; 
var list2 = new List<string> { "BB", "AA", "CC" }; 

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); 

list1.Sort(); 
list2.Sort(); 
+0

현재 스레드의 culture를 변경하는 대신'StringComparer.Ordinal'을'list1.Sort'에 전달하는 것이 더 좋습니다. –

+0

@ Leez 정확히 내가 뭘 발견했는지 내가 질문을 쓰고있는 동안 내가 결국 그 답을 직접 선택하는 이유입니다. 나는 유사한 질문을 찾을 수 없었습니다. 그래서 비슷한 질문이 있다면 장래에 누군가가 이런 식으로 지시되기를 바랍니다. – dlebech

1

List.Sort의 오버로드를 사용하여 현재 문화권을 무시할 수도 있습니다. 일부 유니 코드 문자 이진 동등한 여러 가지고 Normalization and Sorting

: 여기 Demonstration

list1.Sort(StringComparer.Ordinal);

일부 정보이다 : Ordinal 현재 언어에 독립적 인 단순한 바이트 비교를 수행 조합 및/또는 합성 집합으로 이루어진 표현들 유니 코드 문자. 따라서 두 문자열은 동일하게 보이지만 실제로는 은 다른 문자로 구성됩니다. 단일 문자에 대해 복수 표현이 존재하면 정렬 작업이 복잡해집니다. 이 문제에 대한 해결책은

+0

오 그래, 나는 'StringComparer' 매개 변수를 완전히 잊었다. 나를 상기시켜 줘서 고마워. – dlebech

관련 문제