it-gundan.com

StringComparison.OrdinalIgnoreCase 또는 StringComparison.InvariantCultureIgnoreCase 중 일반적으로 가장 적합한 방법은 무엇입니까?

다음과 같은 코드가 있습니다.

If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
    DoSomething()
End If

나는 그 사건에 관심이 없다. OrdinalIgnoreCase, InvariantCultureIgnoreCase 또는 CurrentCultureIgnoreCase를 사용해야합니까?

141
Dave Haynes

최신 .Net Docs에는 이제 상황에 가장 적합한 것을 결정하는 데 도움이되는 표가 있습니다.

MSDN의 " Microsoft .NET 2.0 에서 문자열 사용에 대한 새로운 권장 사항"에서

요약 : 이전에 문자열 비교, 케이싱 및 정렬에 InvariantCulture을 사용하는 코드 소유자는 Microsoft .NET 2.0에서 새로운 String 오버로드 집합을 사용하는 것이 좋습니다. 특히 문화에 구애받지 않고 언어 적으로 관련이 없도록 설계된 데이터 새로운 StringComparisonStringComparison.Ordinal 또는 StringComparison.OrdinalIgnoreCase 멤버를 사용하여 오버로드를 지정해야합니다. 열거. 이것들은 strcmp과 비슷한 바이트 별 비교를 강제하여 본질적으로 기호화 된 문자열의 언어 해석으로 인한 버그를 피할뿐만 아니라 더 나은 성능을 제공합니다.

156
Robert Taylor

그것은 모두 달려있다

유니 코드 문자열을 비교하는 것은 어렵습니다.

텍스트 처리 소프트웨어에서 유니 코드 문자열 검색 및 비교를 구현하려면 동등한 코드 포인트가 있어야합니다. 이 기능이 없으면 특정 코드 포인트 시퀀스를 검색하는 사용자는 다르지만 정식으로 코드 포인트가 다른 시각적으로 구분할 수없는 글리프를 찾을 수 없습니다.

참조 : http://en.wikipedia.org/wiki/Unicode_equivalence


대소 문자를 구분하지 않고 두 개의 유니 코드 문자열을 비교하려고하고 [~ # ~] 모든 곳에서 [~ # ~] 작동하려는 경우 불가능한 문제가 있습니다.

고전적인 예는 터키어 i 입니다.

기본적으로 .Net 프레임 워크는 일반적으로 문자열 관련 함수에 CurrentCulture 를 사용하지만 서수 (바이트 단위) 비교를 사용하는 .Equals는 매우 중요합니다.

이것은 의도적으로 컴퓨터의 문화에 따라 다르게 작동하는 다양한 문자열 기능으로 이어집니다.


그럼에도 불구하고 때때로 우리는 대소 문자를 구분하지 않는 "일반적인 목적"을 원합니다.

예를 들어, 응용 프로그램이 설치된 컴퓨터에 관계없이 문자열 비교가 동일한 방식으로 작동하기를 원할 수 있습니다.

이를 위해 3 가지 옵션이 있습니다.

  1. 문화권을 명시 적으로 설정하고 유니 코드 동등성 규칙을 사용하여 대소 문자를 구분하지 않는 비교를 수행하십시오.
  2. 문화권을 고정 문화권으로 설정하고 유니 코드 동등성 규칙을 사용하여 대소 문자를 구분하지 않는 비교를 수행하십시오.
  3. OrdinalIgnoreCase 를 사용하면 InvariantCulture를 사용하여 문자열을 대문자로 한 후 바이트 단위 비교를 수행합니다.

유니 코드 동등성 규칙은 복잡하므로 방법 1) 또는 2)를 사용하는 것이 OrdinalIgnoreCase보다 비쌉니다. OrdinalIgnoreCase이 특별한 유니 코드 정규화를 수행하지 않는다는 사실은 컴퓨터 화면에서 같은 방식으로 렌더링되는 일부 문자열 인 will not이 동일한 것으로 간주됨을 의미합니다. 예를 들어 : "\u0061\u030a""\u00e5"는 모두 å를 렌더링합니다. 그러나 서수 비교에서는 다른 것으로 간주됩니다.

당신이 선택하는 것은 당신이 만들고있는 어플리케이션에 달려 있습니다.

  • 터키 사용자 만 사용하는 LOB (기간 업무) 앱을 작성하는 경우 방법 1을 사용해야합니다.
  • 예를 들어 db의 열 이름과 같이 간단한 "가짜"대소 문자 구분 비교가 필요한 경우 보통 영어 3 방법을 사용합니다.

Microsoft는 명확한 지침과 함께 권장 사항 을 가지고 있습니다. 그러나 이러한 문제에 접근하기 전에 유니 코드 동등성의 개념을 이해하는 것이 정말 중요합니다.

또한, OrdinalIgnoreCase는 짐승의 매우 특별한 종류 라는 점을 명심하십시오. 이것은 사전 식 측면에서 약간의 서수 비교를 선택하고 선택하는 것입니다. 혼란 스러울 수 있습니다.

57
Sam Saffron

MSDN은 이에 대해 매우 분명한 권장 사항을 제시합니다. http://msdn.Microsoft.com/en-us/library/ms973919.aspx

8
chessguy

나는 그것이 당신의 상황에 달려 있다고 생각합니다. 서수 비교는 실제로 문자의 숫자 유니 코드 값을보고 있기 때문에 알파벳순으로 정렬 할 때 최선의 선택이 아닙니다. 그러나 문자열 비교의 경우 서수는 약간 빠릅니다.

3
Bullines

그것은 당신이 원하는 것에 달려 있지만, 당신이 very 그렇지 않으면 다른 언어에 대한 코드를 현지화하고 싶지 않을 것입니다. 대신 CurrentCulture를 사용하십시오.

또한, OrdinalIgnoreCase는 원하는 숫자 일 수도 있고 아닐 수도있는 숫자를 존중해야합니다.

1
Joel Coehoorn

매우 간단한 대답은 터키어를 사용하지 않는 한 InvariantCulture를 사용할 필요가 없다는 것입니다.

다음 링크를 참조하십시오.

C #에서 ToUpper ()와 ToUpperInvariant ()의 차이점은 무엇입니까?

0
TheMoot