programing

C# 문자열 비교 방식의 차이

i4 2023. 4. 11. 21:39
반응형

C# 문자열 비교 방식의 차이

C#의 문자열 비교는 매우 간단합니다.사실 그것을 하는 몇 가지 방법이 있다.아래 블록에 몇 개 기재되어 있습니다.내가 궁금한 것은 그것들의 차이와 다른 것들보다 어떤 것을 사용해야 하는지 여부이다.어떤 일이 있어도 피해야 하는가?리스트에 올리지 않은 게 더 있나요?

string testString = "Test";
string anotherString = "Another";

if (testString.CompareTo(anotherString) == 0) {}
if (testString.Equals(anotherString)) {}
if (testString == anotherString) {}

(주의: 저는 이 예에서 동등성을 찾고 있습니다.이상 또는 그 이상일 필요는 없습니다만, 코멘트도 자유롭게 해 주세요.)

이러한 기능의 동작에 관한 규칙은 다음과 같습니다.

stringValue.CompareTo(otherStringValue)

  1. null 앞에
  2. CultureInfo.CurrentCulture.CompareInfo.Compare이것은 문화 의존적인 비교를 사용한다는 것을 의미합니다.은, 「 」가 「 」라고 하는 일 가능성이 있습니다.ßSS 이와

stringValue.Equals(otherStringValue)

  1. null
  2. 「」를 한StringComparison직접 ß 않다SS

stringValue == otherStringValue

  1. 않다stringValue.Equals().
  2. ==Equals(string a, string b)) 방식EqualsHelper비교할 수 있습니다.
  3. " ".Equals() null이 생기다null예외(「」의 )==지지않않않않

Object.ReferenceEquals(stringValue, otherStringValue)

참조가 동일한지 확인합니다. 즉, 동일한 내용을 가진 두 문자열이 아니라 문자열 개체 자체와 비교합니다.


위의 메서드 호출을 사용하는 옵션에서는 비교 방법을 지정하는 옵션이 더 많은 오버로드가 있음을 주의해 주십시오.

그에 문화적인 비교를 사용할지를 결정해 이 좋습니다..CompareTo ★★★★★★★★★★★★★★★★★」.Equals(서양속담, 돈속담)

MSDN에서:

CompareTo 메서드는 주로 작업을 정렬하거나 알파벳 순으로 정렬할 때 사용하도록 설계되었습니다.메서드 호출의 주요 목적이 2개의 문자열이 동일한지 여부를 판별하는 경우 사용하지 마십시오.두 문자열이 동일한지 여부를 확인하려면 Equals 메서드를 호출합니다."

'쓰다'라는 표현을 쓰라고 ..Equals.CompareTo평등만을 추구할 때.와의 차이가 있는지는 잘 모르겠습니다..Equals ★★★★★★★★★★★★★★★★★」==★★★★★★★★★★★★★★★★의 경우string ㅇㅇㅇㅇ를 합니다. 나는 가끔 그것을 사용할 것이다..Equals ★★★★★★★★★★★★★★★★★」Object.ReferenceEquals==에 다시 해서 내 ==그 클래스의 오퍼레이터.

BCL 방식의 차이가 궁금하신 경우 Reflector를 이용해 주십시오.

다음 가이드라인을 따릅니다.

완전 일치: EDIT: 이전에는 Equals(string, string) 내에서 객체 == 연산자를 사용하여 객체 참조를 비교한다는 원칙에 따라 항상 == 연산자를 사용했지만 strA인 것 같습니다.Equals(strB)는 여전히 문자열보다 전체적으로 1~11% 빠릅니다.동등(strA, strB), strA == strB 및 문자열.CompareOrdinal(strA, strB).StopWatch를 사용하여 동일한/다른 문자열 길이와 다양한 크기(1B~5MB)의 내부/비내부 문자열 값을 모두 루프 테스트했습니다.

strA.Equals(strB)

사람이 읽을 수 있는 일치(서양 문화, 대소문자를 구분하지 않음):

string.Compare(strA, strB, StringComparison.OrdinalIgnoreCase) == 0

사람이 읽을 수 있는 일치(기타 모든 문화, CultureInfo에 의해 정의된 무차별 대소문자/accent/kana 등):

string.Compare(strA, strB, myCultureInfo) == 0

사람이 읽을 수 있는 사용자 지정 규칙(기타 모든 문화):

CompareOptions compareOptions = CompareOptions.IgnoreCase
                              | CompareOptions.IgnoreWidth
                              | CompareOptions.IgnoreNonSpace;
string.Compare(strA, strB, CultureInfo.CurrentCulture, compareOptions) == 0

Ed가 말했듯이 Compare To는 정렬에 사용됩니다.

단, 에는 차이가 있습니다.및 ==과 같습니다.

==는 기본적으로 다음 코드를 해결합니다.

if(object.ReferenceEquals(left, null) && 
   object.ReferenceEquals(right, null))
    return true;
if(object.ReferenceEquals(left, null))
    return right.Equals(left);
return left.Equals(right);

간단한 이유는 다음과 같이 예외가 발생한다는 것입니다.

string a = null;
string b = "foo";

bool equal = a.Equals(b);

그리고 다음 사항은 그렇지 않습니다.

string a = null;
string b = "foo";

bool equal = a == b;

문자열 비교 문제에 대한 적절한 설명과 프랙티스는 "New Recommendations for Using Strings in Microsoft" (Microsoft 문자열 사용에 대한 새로운 권장사항)을 참조하십시오.의 「문자열 사용의 베스트 프랙티스」도 참조해 주세요.NET 프레임워크


전술한 각 방법(및 기타)에는 특별한 목적이 있습니다.이들 간의 주요 차이점은 기본적으로 어떤 종류의 StringComparison Enumeration을 사용하고 있느냐입니다.몇 가지 옵션이 있습니다.

  • 현재의 문화
  • Current Culture Ignore 케이스
  • 불변 문화
  • Universent Culture Ignore Case
  • 서수
  • Ordinal Ignore 케이스

위의 비교 유형은 각각 다른 사용 사례를 대상으로 합니다.

  • 서수
    • 대소문자를 구분하는 내부 식별자
    • XML 및 HTTP 등의 표준에서 대소문자를 구분하는 식별자
    • 대소문자를 구분하는 보안 관련 설정
  • 순서형 무시 ★★
    • 대소문자를 구분하지 않는 내부 식별자
    • XML 및 HTTP 등의 표준에서 대소문자를 구분하지 않는 식별자
    • 파일 경로(Microsoft Windows)
    • 레지스트리 키/값
    • 환경 변수
    • 리소스 식별자(예: 핸들 이름)
    • 대소문자를 구분하지 않는 보안 관련 설정
  • Universent Culture © Universent Culture Ignore Case
    • 일부 언어 관련 데이터 보유
    • 고정된 정렬 순서가 필요한 언어 데이터 표시
  • Current Culture 는 current Current Culture Ignore Case
    • 사용자에게 표시되는 데이터
    • 대부분의 사용자 입력

String Comparison Enumeration 및 문자열 비교 메서드의 오버로드가 이후 존재합니다.NET 2.0


String.CompareTo 메서드(String)

IComarbable의 사실상 안전한 구현입니다.메서드와 비교합니다.기본 해석:Current Culture(현재의 문화)

사용방법:

CompareTo 메서드는 주로 정렬 또는 알파벳 순으로 작업을 수행하기 위해 설계되었습니다.

따라서

IComarbable 인터페이스를 구현하려면 반드시 이 방법을 사용해야 합니다.

String. 메서드 비교

과부하가 많은 String Class의 스태틱멤버기본 해석:Current Culture(현재의 문화)

가능한 한 StringComparison 파라미터를 포함하는 Compare 메서드의 오버로드를 호출해야 합니다.

String.Equals 메서드

유형 안전을 위해 개체 클래스에서 재정의되고 오버로드됩니다.기본 해석:서수.주의:

String 클래스의 동등 메서드에는 static Equals, static 연산자 ==인스턴스 메서드 Equals가 있습니다.


String Comparer 클래스

문자열 비교에 대처하는 다른 방법도 있습니다.특히 다음과 같은 정렬을 목적으로 합니다.

String Comparer 클래스를 사용하여 유형별 비교를 생성하여 범용 컬렉션의 요소를 정렬할 수 있습니다.Hashtable, Dictionary, SortedList 및 SortedList 등의 클래스는 정렬 목적으로 StringComparer 클래스를 사용합니다.

이 작업은 99%가 필요하기 때문에 퍼포먼스는 중요하지 않습니다만, 몇백만 번 반복해야 하는 경우에는 를 사용하는 것이 좋습니다.일치하지 않는 문자를 발견하면 모든 문자가 거짓으로 처리되지만 CompareTo를 사용할 경우 어떤 문자가 다른 문자보다 적은지 파악해야 하므로 성능 시간이 약간 더 느려집니다.

다른 국가에서 앱을 실행하는 경우 CultureInfo의 의미를 살펴보고 를 사용하는 것이 좋습니다.동등합니다. 저는 미국 전용 앱만 만들고 있기 때문에(누군가가 제대로 작동하지 않아도 상관없습니다), 항상 ==만 사용하고 있습니다.

여기에 기재되어 있는 양식으로 보면, 이 두 가지 양식은 큰 차이가 없습니다. CompareTo에는 을 된다CompareInfoEquals.==환입니니다다

과부하를 생각하면 상황이 달라진다. Compare ★★★★★★★★★★★★★★★★★」==현재 컬처를 사용하여 문자열을 비교할 수 있습니다. Equals ★★★★★★★★★★★★★★★★★」String.CompareStringComparison문화 구분 또는 대소문자를 구분하지 않는 비교를 지정할 수 있는 열거형 인수입니다.만.String.Compare 을 할 수 .CultureInfo기본 문화가 아닌 다른 문화를 사용하여 비교를 수행합니다.

는 '다재다재다재다재다재다재다재다'를 사용하고 있습니다.String.Compare다른 어떤 비교 방법보다 더 많은 비교 방법을 사용하면 원하는 것을 정확하게 지정할 수 있습니다.

큰 차이점 중 하나는 입니다.Equals()는 첫 번째 문자열이 null인 경우 예외를 발생시키지만 ==는 그렇지 않습니다.

       string s = null;
        string a = "a";
        //Throws {"Object reference not set to an instance of an object."}
        if (s.Equals(a))
            Console.WriteLine("s is equal to a");
        //no Exception
        if(s==a)
            Console.WriteLine("s is equal to a");
  • s1. CompareTo(s2) : 2개의 문자열이 동일한지 여부를 확인하는 것이 주된 목적인 경우 사용하지 마십시오.
  • s1 == s2: 대소문자를 무시할 수 없습니다.
  • s1. Equals(s2, String Comparison):s1이 늘인 경우 NullReferenceException을 슬로우합니다.
  • String.Equals(s2, StringComparison):제거 프로세스에서는 이 정적 방법이 WINNER가 됩니다(2개의 문자열이 동일한지 여부를 판단하는 일반적인 사용 사례를 가정합니다).

.Equals를 사용하는 것도 훨씬 읽기 쉽습니다.

.Equals를 사용하면 StringComparison 옵션도 얻을 수 있습니다.케이스나 다른 것들을 무시하는데 매우 편리합니다.

btw, 이것은 false로 평가됩니다.

string a = "myString";
string b = "myString";

return a==b

==는 포인터인 a와 b의 값을 비교하기 때문에 포인터가 메모리의 동일한 개체를 가리키는 경우에만 true로 평가됩니다.동일한 값은 포인터를 참조하고 포인터에 저장된 값을 비교합니다. a.여기서 equals(b)는 참이다.

b를 다음과 같이 변경했을 경우:

b = "MYSTRING";

a. equals(b)는 false이지만,

a.Equals(b, StringComparison.OrdinalIgnoreCase) 

사실일 것이다

a. CompareTo(b)는 문자열의 CompareTo 함수를 호출하여 포인터의 값을 비교하고 a에 저장된 값이 b에 저장된 값보다 작을 경우 0을 반환합니다.Equals(b)는 true이고 그 이외의 경우는 >0 입니다.그러나 이는 대소문자를 구분하기 때문에 Compare To에서 대소문자 등을 무시할 수 있는 옵션이 있을 수 있지만 지금 확인할 시간은 없습니다.다른 사람들이 이미 언급했듯이, 이것은 정렬을 위해 수행될 것입니다.이 방법으로 동등성을 비교하면 불필요한 오버헤드가 발생합니다.

제가 빼먹은 건 확실합니다만, 더 자세한 정보가 필요하시면 이 정도면 실험을 시작할 수 있을 것 같습니다.

언급URL : https://stackoverflow.com/questions/44288/differences-in-string-compare-methods-in-c-sharp

반응형