[c#] C #에서 문자열 비교 방법의 차이점



Answers

MSDN에서 :

"CompareTo 메서드는 주로 정렬 작업이나 알파벳순으로 사용하기 위해 디자인되었으므로 메서드 호출의 주 목적은 두 문자열이 같은지 여부를 확인하는 것이므로 사용해서는 안됩니다. 두 문자열이 동일한 지 여부를 확인하려면 Equals 메서드를 호출하십시오. "

이들은 평등만을 바라 볼 때 .Equals 대신 .Equals 를 사용할 것을 제안합니다. string 클래스에 대해 .Equals== 사이에 차이가 있는지 확실하지 않습니다. 나중에 누군가가오고 그 클래스에 대해 == 연산자를 재정의하는 경우에 대비 Object.ReferenceEquals 때로는 .Equals 또는 Object.ReferenceEquals 를 사용 Object.ReferenceEquals 내 자신의 클래스에 == 를 추가합니다.

Question

C #에서 문자열 비교는 매우 간단합니다. 사실 여러 가지 방법이 있습니다. 나는 아래 블록에 몇 가지를 열거했다. 내가 궁금한 점은 그들 사이의 차이점과 다른 것들 위에 사용해야한다는 점입니다. 반드시 모든 비용을 피해야합니까? 내가 더 이상 열거하지 않았습니까?

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

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

(참고 : 나는이 예에서 평등을 찾고 있는데, 그보다 크거나 크지는 않지만 그것에 대해서도 자유롭게 의견을 말함)




그 성능은 일반적으로 99 %의 시간에 문제가되지 않지만, 이것을 수백만 번 반복해야만한다면 나는 문자를 찾자 마자 .Equals 또는 ==를 사용하는 것이 좋습니다. 그것과 일치하지 않는 것은 모든 것을 false로 던지지만 CompareTo를 사용하면 어떤 캐릭터가 다른 캐릭터보다 작 으면 알아 내야하기 때문에 성능이 약간 떨어집니다.

앱이 다른 국가에서 운영되는 경우 CultureInfo에 대한 의미를 살펴보고 .Equals를 사용하는 것이 좋습니다. 나는 정말 미국을위한 앱을 작성하기 때문에 (누군가가 제대로 작동하지 않는지 상관하지 않는다.) 항상 ==를 사용한다.




CompareTo 는 문자열을 문자열 객체와 비교하고 int 값을 반환합니다. 값이 0이면 문자열이 동일 함을 의미합니다.

string country = "southindia";
object ob1 = country.Clone();
Console.WriteLine( country.CompareTo(ob1));

string country = "southindia";
string cou = "insia";
int n = country.CompareTo(cou);
Console.WriteLine( n );



주의해야 할 큰 차이점은 .Equals ()는 첫 번째 문자열이 null 인 경우 예외를 throw하지만 Where ==는 예외가 아닙니다.

       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");



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

btw, false로 평가됩니다.

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

return a==b

==는 a와 b (포인터)의 값을 비교하기 때문에 포인터가 메모리의 같은 객체를 가리키는 경우에만 true로 평가됩니다. .Equals는 포인터를 역 참조하고 포인터에 저장된 값을 비교합니다. a.Equals (b)는 사실 일 것입니다.

b를로 변경하면 :

b = "MYSTRING";

a.Equals (b)는 거짓이지만

a.Equals(b, StringComparison.OrdinalIgnoreCase) 

사실 일 것이다.

a.CompareTo (b)는 포인터의 값을 비교하고 a에 저장된 값이 b에 저장된 값보다 작 으면 0을 반환하는 문자열의 CompareTo 함수를 호출하고, a.Equals (b)가 true이면 0을 반환하고 > 0 그렇지 않으면. 그러나 이것은 대소 문자를 구분하므로 CompareTo가 대소 문자를 무시할 수있는 옵션이 있다고 생각하지만 지금은 볼 시간이 없습니다. 다른 사람들이 이미 언급했듯이, 이것은 정렬을 위해 이루어질 것입니다. 이런 식으로 평등을 비교하면 불필요한 오버 헤드가 발생합니다.

나는 물건을 버릴 것이라고 확신하지만, 자세한 내용이 필요하면 실험을 시작하기에 충분한 정보라고 생각합니다.




Ed 말했듯이, CompareTo는 정렬에 사용됩니다.

그러나 .Equals와 == 사이에는 차이가 있습니다.

== 다음 코드를 본질적으로 해결합니다 :

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

간단한 이유는 다음과 같은 예외가 throw됩니다 :

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

bool equal = a.Equals(b);

그리고 다음은하지 않습니다 :

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

bool equal = a == b;



Related