다음은 대소 문자를 구분한다는 것을 알고 있습니다.
if (StringA == StringB) {
그래서 두 문자열을 둔감하게 비교하는 연산자가 있습니까?
~=
평행 ==
대소 문자를 구분 버전으로.
다음은 대소 문자를 구분한다는 것을 알고 있습니다.
if (StringA == StringB) {
그래서 두 문자열을 둔감하게 비교하는 연산자가 있습니까?
~=
평행 ==
대소 문자를 구분 버전으로.
답변:
이 시도:
string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);
if A$=B$ then goto 10
"를 사용할 수있는 시대는 지났습니다
대소 문자를 무시하고 두 문자열을 비교 하는 가장 좋은 방법 은 String.Equals 정적 메서드를 사용하여 서수 무시 문자열 비교를 지정하는 것입니다. 또한 문자열을 소문자 나 대문자로 변환 한 후 비교하는 것보다 훨씬 빠른 방법입니다.
두 가지 접근 방식의 성능을 테스트했으며 서수 무시 문자열 비교가 9 배 이상 빨랐습니다 ! 문자열을 소문자 또는 대문자로 변환하는 것보다 안정적입니다 (터키어 i 문제를 확인하십시오). 따라서 항상 String.Equals 메소드를 사용하여 문자열이 동일한 지 비교하십시오.
String.Equals(string1, string2, StringComparison.OrdinalIgnoreCase);
문화권 별 문자열 비교를 수행하려는 경우 다음 코드를 사용할 수 있습니다.
String.Equals(string1, string2, StringComparison.CurrentCultureIgnoreCase);
두 번째 예는 현재 문화권의 문자열 비교 논리를 사용하므로 첫 번째 예의 "단일 무시 무시"비교보다 느리므로 문화권 별 문자열 비교 논리가 필요하지 않은 경우 최대 성능을 유지 한 후에는 "단일 무시 무시"비교를 사용하십시오.
자세한 내용 은 내 블로그에서 전체 기사를 읽으십시오 .
ToLower
나 ToLowerInvariant
: 그들은 단지 비교를 수행하기 위해 메모리를 만들고, 새로운 문자 집합이 유니 코드에 추가로 그들이 실패 할 수 있습니다. ToUpper
특히 터키의 'i'때문에 실패합니다. ToLower
비슷한 이유로 미래에 실패하지 않는 이유 는 없습니다.
ToLower
또는 ToLowerInvariant
방법을 사용하지 않는 것이 좋습니다 String.Equals
. 방법이 얼마나 효율적인지 보여주고 싶었습니다 .
StringComparer
정적 클래스에는 원하는 모든 유형의 대소 문자 구분에 대한 비교자를 반환 하는 여러 속성 이 있습니다.
예를 들어
StringComparer.CurrentCultureIgnoreCase.Equals(string1, string2)
또는
StringComparer.CurrentCultureIgnoreCase.Compare(string1, string2)
인수 를 취하는 과부하 string.Equals
또는 string.Compare
과부하 보다 약간 깨끗합니다 StringComparison
.
System.Collections.CaseInsensitiveComparer
또는
System.StringComparer.OrdinalIgnoreCase
운영자? 아니요, 그러나 문자열 비교가 대소 문자를 구분하지 않도록 문화를 변경할 수 있다고 생각합니다.
// you'll want to change this...
System.Threading.Thread.CurrentThread.CurrentCulture
// and you'll want to custimize this
System.Globalization.CultureInfo.CompareInfo
equals 연산자로 문자열을 비교하는 방식이 변경 될 것이라고 확신합니다.
구문을 단순화하는 아이디어는 다음과 같습니다.
public class IgnoreCase
{
private readonly string _value;
public IgnoreCase(string s)
{
_value = s;
}
protected bool Equals(IgnoreCase other)
{
return this == other;
}
public override bool Equals(object obj)
{
return obj != null &&
(ReferenceEquals(this, obj) || (obj.GetType() == GetType() && this == (IgnoreCase) obj));
}
public override int GetHashCode()
{
return _value?.GetHashCode() ?? 0;
}
public static bool operator ==(IgnoreCase a, IgnoreCase b)
{
return string.Equals(a, b, StringComparison.OrdinalIgnoreCase);
}
public static bool operator !=(IgnoreCase a, IgnoreCase b)
{
return !(a == b);
}
public static implicit operator string(IgnoreCase s)
{
return s._value;
}
public static implicit operator IgnoreCase(string s)
{
return new IgnoreCase(s);
}
}
다음과 같이 사용 가능
Console.WriteLine((IgnoreCase) "a" == "b"); // false
Console.WriteLine((IgnoreCase) "abc" == "abC"); // true
Console.WriteLine((IgnoreCase) "Abc" == "aBc"); // true
Console.WriteLine((IgnoreCase) "ABC" == "ABC"); // true
IgnoreCase
대 IgnoreCaseString
(나는 그래서 자바 암시 권투 대 암시 언 박싱을 선택합니다)와 모호한는 생각 이의 문자열로 암시 적 캐스트 다시 자바에서이 것없는 일을). 그리고 이것은 각 비교에 대한 호출 트리 실행으로 표시된 사용 사례에 대한 여러 중첩 된 메소드 호출로 점프하는 2 개의 새 오브젝트의 메모리 오버 헤드를 작성합니다. 즉, 대부분의 경우 성능이 충분할 것입니다.
이 비교 방법의 끝에 입력하는 데 익숙합니다. , StringComparison.
그래서 확장했습니다.
namespace System
{ public static class StringExtension
{
public static bool Equals(this string thisString, string compareString,
StringComparison stringComparison)
{
return string.Equals(thisString, compareString, stringComparison);
}
}
}
thisString
ext를 호출하기 전에 null을 확인해야합니다 .
if (StringA.ToUpperInvariant() == StringB.ToUpperInvariant()) {
사람들은 ToUpperInvariant ()가 ToLowerInvariant ()보다 빠르다고보고합니다.
다른 답변은 여기에서 완전히 유효하지만 어떻게 든 입력 StringComparison.OrdinalIgnoreCase
하고 사용 하는 데 시간이 걸립니다 String.Compare
.
비교가 대소 문자를 구분하는지 또는 부울을 사용하여 대소 문자를 구분하지 않는지 지정할 수있는 간단한 문자열 확장 방법을 코딩했습니다. 다음 답변을 참조하십시오.