2008-11-05 5 views
3

string.compare (string, string)을 사용하여 일부 값을 정렬하는 응용 프로그램이 있습니다. 내가 이해할 수없는 것은 "1022"가 "10-23"미만으로 비교되고 "10-23"이 "1024"미만으로 비교되는 이유입니다.이러한 비교 결과는 어떻게 되나요?

"-"값에 특정한 것이 있습니까? string.compare의 과부하로 인해 동일한 유형의 데이터 (대시가있는 숫자)에 대해 다른 문화권 설정으로 동일한 결과가 제공됩니까?

답변

5

string.Compare(String, String)의 문서에서 :

비교는 단어 정렬 규칙을 사용하여 수행됩니다.

further :

.NET 프레임 워크는 정렬의 세 가지 방법을 사용하여 정렬 단어, 문자열 정렬 및 순서 정렬. 단어 정렬은 문화권에 따라 구분되는 문자열 비교를 수행합니다. 특정 영숫자가 아닌 문자에는 특수 가중치가 할당되어있을 수 있습니다. 예를 들어, 하이픈 ("-")에 할당 된 매우 작은 가중치가있을 수 있으므로 "coop"및 "co-op"가 정렬 된 목록에서 서로 옆에 나타납니다. 문자열 정렬은 특별한 경우가 없다는 점을 제외하고는 단어 정렬과 유사합니다. 따라서 영숫자가 아닌 모든 기호는 모든 영숫자 앞에옵니다. 서수 정렬은 문자열의 각 요소에 대한 유니 코드 값을 기준으로 문자열을 비교합니다.

마이클 카플란 (Michael Kaplan)의 자세한 내용은 A&P of Sort Keys, part 9 (aka Not always transitive, but punctual and punctuating)입니다.

3

글쎄, 대시를 무시하는 것은 꽤 결백합니다. 그 (것)들을 포함하고 싶은 경우에, 아마 과부하에서 StringComparison.Ordinal를 이용하십시오.

워드 정렬 문자열의 문화에 민감한 비교를 수행 :

docs for string.Compare 읽기, 그것은 here에서 의미 단어 정렬 규칙을 사용합니다. 특정 영숫자가 아닌 문자는 특수 가중치가 할당되었을 수 있습니다. 예제의 경우 하이픈 ("-")에 매우 작은 가중치가 할당 될 수 있으므로 "coop"및 "co-op"가 정렬 된 목록에 서로 옆에 나타납니다.

은 적어도 그것을 이행이다 : 나는 매우 비슷한 관련된 대시에 대해 "연결"과 bug 기록 - 비 전이 비교 보낸 사람 < B, B < C C가 < A. 본질적으로 휴식을 정렬 규칙. 그것은 닫혔다 "고쳐주지 않을 것이다". 여기있다 :

string s1 = "-0.67:-0.33:0.33"; 
string s2 = "0.67:-0.33:0.33"; 
string s3 = "-0.67:0.33:-0.33"; 
Console.WriteLine(s1.CompareTo(s2)); 
Console.WriteLine(s2.CompareTo(s3)); 
Console.WriteLine(s1.CompareTo(s3)); 

는 (1,1, -1을 반환 내 컴퓨터에서)

관련 문제