일반적으로 StringComparison.OrdinalIgnoreCase 또는 StringComparison.InvariantCultureIgnoreCase 중 어느 것을 사용하는 것이 가장 좋습니까?

StackOverflow https://stackoverflow.com/questions/72696

  •  09-06-2019
  •  | 
  •  

문제

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

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

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

도움이 되었습니까?

해결책

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

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

요약:이전에 사용했던 코드 소유자 InvariantCulture 문자열 비교, 대/소문자 구분 및 정렬을 위해 새로운 세트 사용을 강력히 고려해야 합니다. String Microsoft .NET 2.0의 오버로드. 특히, 문화에 구애받지 않고 언어적으로 관련이 없도록 설계된 데이터 다음 중 하나를 사용하여 오버로드 지정을 시작해야 합니다. StringComparison.Ordinal 또는 StringComparison.OrdinalIgnoreCase 새로운 멤버들 StringComparison 열거.이는 다음과 유사한 바이트별 비교를 시행합니다. strcmp 이는 본질적으로 기호 문자열의 언어적 해석으로 인한 버그를 방지할 뿐만 아니라 더 나은 성능을 제공합니다.

다른 팁

그것은 모두 달려있다

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

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

보다: http://en.wikipedia.org/wiki/Unicode_equivalence


2개의 유니코드 문자열을 대소문자를 구분하지 않고 비교하려고 하며 작동하기를 원하는 경우 어디에나, 불가능한 문제가 있습니다.

고전적인 예는 터키어 나는, 대문자로 쓰면 İ가 됩니다(점에 주목하세요).

기본적으로 .Net 프레임워크는 일반적으로 다음을 사용합니다. 현재문화 매우 중요한 예외를 제외하고 문자열 관련 함수의 경우 .Equals 이는 서수(바이트 단위) 비교를 사용합니다.

이는 의도적으로 다양한 문자열 함수가 컴퓨터 문화에 따라 다르게 동작하도록 유도합니다.


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

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

이를 달성하기 위해 우리에게는 3가지 옵션이 있습니다:

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

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

어떤 것을 선택하느냐에 따라 구축 중인 애플리케이션이 달라집니다.

  • 터키 사용자만 사용하는 LOB(기간 업무) 앱을 작성한다면 반드시 방법 1을 사용하겠습니다.
  • 대소문자를 구분하지 않는 간단한 "가짜" 비교가 필요한 경우(예: 일반적으로 영어인 db의 열 이름) 아마도 방법 3을 사용할 것입니다.

마이크로소프트는 그들의 추천 세트 명시적인 지침이 있습니다.그러나 이러한 문제에 접근하기 전에 유니코드 동등성 개념을 이해하는 것이 정말 중요합니다.

또한 OrdinalIgnoreCase는 아주 특별한 종류 그것은 사전식 측면이 혼합된 것과 약간의 서수 비교를 선택하고 선택하는 것입니다.이는 혼란스러울 수 있습니다.

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

상황에 따라 다를 것 같아요.서수 비교는 실제로 문자의 숫자 유니코드 값을 살펴보기 때문에 알파벳순으로 정렬할 때는 최선의 선택이 아닙니다.그러나 문자열 비교의 경우 서수가 조금 더 빠릅니다.

그것은 당신이 원하는 것에 달려 있지만, 나는 당신이 원하지 않는 한 불변 문화를 피하고 싶습니다. 매우 다른 언어에 대한 코드를 현지화하고 싶지 않을 것입니다.대신 CurrentCulture를 사용하세요.

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

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

다음 링크를 참조하세요:

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top