C# 문자열 비교 방식의 차이
C#의 문자열 비교는 매우 간단합니다.사실 그것을 하는 몇 가지 방법이 있다.아래 블록에 몇 개 기재되어 있습니다.내가 궁금한 것은 그것들의 차이와 다른 것들보다 어떤 것을 사용해야 하는지 여부이다.어떤 일이 있어도 피해야 하는가?리스트에 올리지 않은 게 더 있나요?
string testString = "Test";
string anotherString = "Another";
if (testString.CompareTo(anotherString) == 0) {}
if (testString.Equals(anotherString)) {}
if (testString == anotherString) {}
(주의: 저는 이 예에서 동등성을 찾고 있습니다.이상 또는 그 이상일 필요는 없습니다만, 코멘트도 자유롭게 해 주세요.)
이러한 기능의 동작에 관한 규칙은 다음과 같습니다.
stringValue.CompareTo(otherStringValue)
null
앞에CultureInfo.CurrentCulture.CompareInfo.Compare
이것은 문화 의존적인 비교를 사용한다는 것을 의미합니다.은, 「 」가 「 」라고 하는 일 가능성이 있습니다.ß
SS
이와
stringValue.Equals(otherStringValue)
null
- 「」를 한
StringComparison
직접ß
않다SS
stringValue == otherStringValue
- 않다
stringValue.Equals()
. ==
Equals(string a, string b)
) 방식EqualsHelper
비교할 수 있습니다.- " "
.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
에는 을 된다CompareInfo
Equals
.==
환입니니다다
과부하를 생각하면 상황이 달라진다. Compare
★★★★★★★★★★★★★★★★★」==
현재 컬처를 사용하여 문자열을 비교할 수 있습니다. Equals
★★★★★★★★★★★★★★★★★」String.Compare
수 StringComparison
문화 구분 또는 대소문자를 구분하지 않는 비교를 지정할 수 있는 열거형 인수입니다.만.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
'programing' 카테고리의 다른 글
Git Stash를 한 번에 모두 삭제하려면 어떻게 해야 하나요? (0) | 2023.04.11 |
---|---|
Microsoft SQL Server에서 10진수 열의 정밀도를 변경하려면 어떻게 해야 합니까? (0) | 2023.04.11 |
WPF의 더미 디자인 타임 데이터에 사용할 수 있는 접근방식은 무엇인가? (0) | 2023.04.11 |
Xcode: 프로젝트 빌딩의 "file xxx.png is missing from working copy" 문제 (0) | 2023.04.11 |
Angular JS를 사용하여 다른 모듈 구성에 상수 주입 (0) | 2023.04.06 |