불변 문화와 순서 문자열 비교의 차이
동일성을 위해 c#의 두 문자열을 비교할 때 불변 문화와 순서 비교의 차이점은 무엇입니까?
불변의 문화
"표준" 문자 순서 집합(a,b,c 등)을 사용합니다.이는 문자를 다른 순서로 정렬할 수 있는 일부 특정 로케일과는 대조적입니다(로케일에 따라 a-with-acute는 'a' 앞이나 뒤에 있을 수 있습니다).
서수
반면 문자를 나타내는 원시 바이트 값은 순수하게 살펴봅니다.
다양한 StringComparision 값의 결과를 보여주는 훌륭한 샘플이 http://msdn.microsoft.com/en-us/library/e6883c06.aspx 에 있습니다.끝 부분에 다음과 같이 표시됩니다(발췌).
StringComparison.InvariantCulture:
LATIN SMALL LETTER I (U+0069) is less than LATIN SMALL LETTER DOTLESS I (U+0131)
LATIN SMALL LETTER I (U+0069) is less than LATIN CAPITAL LETTER I (U+0049)
LATIN SMALL LETTER DOTLESS I (U+0131) is greater than LATIN CAPITAL LETTER I (U+0049)
StringComparison.Ordinal:
LATIN SMALL LETTER I (U+0069) is less than LATIN SMALL LETTER DOTLESS I (U+0131)
LATIN SMALL LETTER I (U+0069) is greater than LATIN CAPITAL LETTER I (U+0049)
LATIN SMALL LETTER DOTLESS I (U+0131) is greater than LATIN CAPITAL LETTER I (U+0049)
불변의 문화가 산출하는 곳에서 (U+0069,U+0049,U+00131), 순서 수율(U+0049,U+0069,U+00131).
예를 들어, 그것은 중요합니다 - 캐릭터 확장이라는 것이 있습니다.
var s1 = "Strasse";
var s2 = "Straße";
s1.Equals(s2, StringComparison.Ordinal); //false
s1.Equals(s2, StringComparison.InvariantCulture); //true
와 함께InvariantCulture
ß 문자가 ss로 확장됩니다.
에서 문자열 사용에 대한 모범 사례를 가리킵니다.NET 프레임워크:
- 사용하다
StringComparison.Ordinal
또는StringComparison.OrdinalIgnoreCase
문화에 구애받지 않는 문자열 일치에 대한 안전한 기본값으로 비교할 수 있습니다. - 와 합니다.
StringComparison.Ordinal
또는StringComparison.OrdinalIgnoreCase
더 나은 성능을 위해. - 비언사를 합니다.
StringComparison.Ordinal
또는StringComparison.OrdinalIgnoreCase
문자열 합니다.CultureInfo.InvariantCulture
비교가 언어학적으로 관련이 없는 경우(예: 예를 들어).
그리고 마지막으로:
- 대부분의 경우 에 기반한 문자열 작업을 사용하지 마십시오.몇 안 되는 예외 중 하나는 언어적으로 의미가 있지만 문화적으로 불가지론적인 데이터를 지속하는 경우입니다.
(악센트가 드문 영어에서) 또 다른 편리한 차이점은 불변 문화 비교는 먼저 문자열 전체를 대소문자 구분 없이 비교한 다음, 필요한 경우 구별되는 문자만 비교한 후 대소문자 구분 없이 구분한다는 것입니다. (물론 대소문자 구분 없이 비교할 수도 있습니다.)사례별로 구분되지 않을 것입니다.)수정됨:악센트 문자는 동일한 문자의 다른 버전으로 간주되며 문자열은 먼저 악센트를 무시하고 비교한 다음 일반 문자가 모두 일치하는 경우(대소문자를 구분하지 않는 비교에서 궁극적으로 무시하지 않는 경우를 제외하고는 다른 경우와 마찬가지)를 설명합니다.이 그룹은 같은 단어의 악센트 버전을 첫 번째 악센트 차이에서 완전히 분리하는 대신 서로 가까운 곳에 그룹화합니다.이것은 일반적으로 사전에서 찾을 수 있는 정렬 순서이며 대문자로 표시된 단어는 해당 소문자 바로 옆에 나타나고 악센트가 있는 문자는 해당 악센트가 없는 문자 근처에 있습니다.
순서 비교는 숫자 문자 값과 엄격하게 비교하며 첫 번째 차이에서 멈춥니다.이렇게 하면 대문자와 소문자(그리고 악센트가 있는 문자는 소문자와 완전히 별개)로 정렬되므로 대문자 단어는 소문자와 거의 일치하지 않습니다.
불변의 문화는 대문자가 소문자보다 크다고 생각하는 반면, 순서형은 대문자가 소문자보다 작다고 생각합니다(컴퓨터에 소문자가 있기 전의 옛날부터 ASCII의 홀드오버, 대문자가 먼저 할당되어 나중에 추가된 소문자보다 낮은 값).
: 예를들어, 순에따라서:"0" < "9" < "A" < "Ab" < "Z" < "a" < "aB" < "ab" < "z" < "Á" < "Áb" < "á" < "áb"
불변의 문화에 의해: 그고불변문의해에화의리의:"0" < "9" < "a" < "A" < "á" < "Á" < "ab" < "aB" < "Ab" < "áb" < "Áb" < "z" < "Z"
비록 그 질문이 평등에 관한 것이지만, 빠른 시각적 참고를 위해, 여기에 몇 가지 문화를 사용하여 정렬된 문자열의 순서가 있습니다. 그 중 몇 가지 특이점을 보여줍니다.
Ordinal 0 9 A Ab a aB aa ab ss Ä Äb ß ä äb ぁ あ ァ ア 亜 A
IgnoreCase 0 9 a A aa ab Ab aB ss ä Ä äb Äb ß ぁ あ ァ ア 亜 A
--------------------------------------------------------------------
InvariantCulture 0 9 a A A ä Ä aa ab aB Ab äb Äb ss ß ァ ぁ ア あ 亜
IgnoreCase 0 9 A a A Ä ä aa Ab aB ab Äb äb ß ss ァ ぁ ア あ 亜
--------------------------------------------------------------------
da-DK 0 9 a A A ab aB Ab ss ß ä Ä äb Äb aa ァ ぁ ア あ 亜
IgnoreCase 0 9 A a A Ab aB ab ß ss Ä ä Äb äb aa ァ ぁ ア あ 亜
--------------------------------------------------------------------
de-DE 0 9 a A A ä Ä aa ab aB Ab äb Äb ß ss ァ ぁ ア あ 亜
IgnoreCase 0 9 A a A Ä ä aa Ab aB ab Äb äb ss ß ァ ぁ ア あ 亜
--------------------------------------------------------------------
en-US 0 9 a A A ä Ä aa ab aB Ab äb Äb ß ss ァ ぁ ア あ 亜
IgnoreCase 0 9 A a A Ä ä aa Ab aB ab Äb äb ss ß ァ ぁ ア あ 亜
--------------------------------------------------------------------
ja-JP 0 9 a A A ä Ä aa ab aB Ab äb Äb ß ss ァ ぁ ア あ 亜
IgnoreCase 0 9 A a A Ä ä aa Ab aB ab Äb äb ss ß ァ ぁ ア あ 亜
관측치:
de-DE
,ja-JP
,그리고.en-US
Invariant
만 하는ss
그리고.ß
의 세 문화와는 .da-DK
정렬합니다.- 그자리의
IgnoreCase
된 문화에 입니다.
위 표를 생성하는 데 사용되는 코드:
var l = new List<string>
{ "0", "9", "A", "Ab", "a", "aB", "aa", "ab", "ss", "ß",
"Ä", "Äb", "ä", "äb", "あ", "ぁ", "ア", "ァ", "A", "亜" };
foreach (var comparer in new[]
{
StringComparer.Ordinal,
StringComparer.OrdinalIgnoreCase,
StringComparer.InvariantCulture,
StringComparer.InvariantCultureIgnoreCase,
StringComparer.Create(new CultureInfo("da-DK"), false),
StringComparer.Create(new CultureInfo("da-DK"), true),
StringComparer.Create(new CultureInfo("de-DE"), false),
StringComparer.Create(new CultureInfo("de-DE"), true),
StringComparer.Create(new CultureInfo("en-US"), false),
StringComparer.Create(new CultureInfo("en-US"), true),
StringComparer.Create(new CultureInfo("ja-JP"), false),
StringComparer.Create(new CultureInfo("ja-JP"), true),
})
{
l.Sort(comparer);
Console.WriteLine(string.Join(" ", l));
}
불변량은 언어학적으로 적절한 비교 유형입니다.
순서형은 비교의 이진 유형입니다. (더 빠름)
http://www.siao2.com/2004/12/29/344136.aspx 을 참조하십시오.
다음은 불변 문화 무시 사례와 순서 무시 사례를 사용한 문자열 동등성 비교가 동일한 결과를 제공하지 않는 예입니다.
string str = "\xC4"; //A with umlaut, Ä
string A = str.Normalize(NormalizationForm.FormC);
//Length is 1, this will contain the single A with umlaut character (Ä)
string B = str.Normalize(NormalizationForm.FormD);
//Length is 2, this will contain an uppercase A followed by an umlaut combining character
bool equals1 = A.Equals(B, StringComparison.OrdinalIgnoreCase);
bool equals2 = A.Equals(B, StringComparison.InvariantCultureIgnoreCase);
이 값을 실행하면 equals1은 false이고 equals2는 true입니다.
차이점을 보여주기 위해 화려한 유니코드 문자 예제를 사용할 필요가 없습니다.여기 제가 오늘 발견한 하나의 간단한 예가 있는데, 이것은 ASCII 문자로만 구성된 놀라운 것입니다.
표에 ASCII는0
이 (48, 0x30)보다 .보다 작습니다._
(95, 0x5F)는으로 비교했을 때.불변의 문화는 반대로 말할 수 있습니다(아래 PowerShell 코드)
PS> [System.StringComparer]::Ordinal.Compare("_", "0")
47
PS> [System.StringComparer]::InvariantCulture.Compare("_", "0")
-1
항상 오버로드로 수락하는 문자열 메서드에서 불변 문화를 사용합니다.불변의 문화를 사용하면 안전한 편에 설 수 있습니다.많은 .NET 프로그래머들이 이 기능을 사용하지 않을 수도 있지만 소프트웨어가 다른 문화권에서 사용될 경우 불변의 문화는 매우 유용한 기능입니다.
언급URL : https://stackoverflow.com/questions/492799/difference-between-invariantculture-and-ordinal-string-comparison
'IT' 카테고리의 다른 글
수업에서 스토리보드를 프로그래밍 방식으로 로드하려면 어떻게 해야 합니까? (0) | 2023.05.13 |
---|---|
C# 콘솔 앱에서 Ctrl+C(SIGINT)를 어떻게 트랩합니까? (0) | 2023.05.13 |
사용자 또는 관리자가 응용프로그램 사용에 동의하지 않았습니다 - 이 사용자 및 리소스에 대한 대화형 권한 부여 요청을 보냅니다. (0) | 2023.05.13 |
각도 - 모든 요청에 대한 헤더 설정 (0) | 2023.05.13 |
당신은 append 대신 mongo $push prepend를 가질 수 있습니까? (0) | 2023.05.13 |