programing

C# 대소문자를 구분하지 않는 동등 연산자가 있습니까?

abcjava 2023. 7. 30. 16:47
반응형

C# 대소문자를 구분하지 않는 동등 연산자가 있습니까?

다음은 대소문자를 구분하는 항목입니다.

if (StringA == StringB) {

그렇다면 두 문자열을 무감각하게 비교할 연산자가 있을까요?

사용해 보십시오.

string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);

문자의 대소문자를 무시하고 두 문자열을 비교하는 가장 좋은 방법은 문자열을 사용하는 입니다.순서 무시 대소문자열 비교를 지정하는 정적 메서드와 같습니다.이것은 또한 가장 빠른 방법으로, 문자열을 소문자 또는 대문자로 변환하고 그 이후에 비교하는 것보다 훨씬 빠릅니다.

저는 두 가지 접근 방식의 성능을 테스트했고 순서 무시 대소문자열 비교가 9배 이상 빨랐습니다!또한 문자열을 소문자 또는 대문자로 변환하는 것보다 더 신뢰할 수 있습니다(터키어 i 문제 확인).따라서 항상 문자열을 사용합니다.동일한 문자열을 비교하는 동일한 방법:

String.Equals(string1, string2, StringComparison.OrdinalIgnoreCase);

배양 관련 문자열 비교를 수행하려면 다음 코드를 사용할 수 있습니다.

String.Equals(string1, string2, StringComparison.CurrentCultureIgnoreCase);

두 번째 예제는 현재 문화의 문자열 비교 논리를 사용하므로 첫 번째 예제의 "순서 무시 사례" 비교보다 느리기 때문에 문화별 문자열 비교 논리가 필요하지 않고 최대 성능을 추구하는 경우에는 "순서 무시 사례" 비교를 사용합니다.

더 많은 정보를 원하시면, 제 블로그의 전체 이야기를 읽으세요.

여러 가지 속성이 있습니다.StringComparer원하는 모든 유형의 대/소문자 구분에 대해 비교를 반환하는 정적 클래스:

StringComparer특성.

예를 들어, 당신은 전화할 수 있습니다.

StringComparer.CurrentCultureIgnoreCase.Equals(string1, string2)

또는

StringComparer.CurrentCultureIgnoreCase.Compare(string1, string2)

그것은 그것보다 조금 더 깨끗합니다.string.Equals또는string.Compare인수가 필요한 오버로드입니다.

System.Collections.CaseInsensitiveComparer

또는

System.StringComparer.OrdinalIgnoreCase
string.Equals(StringA, StringB, StringComparison.CurrentCultureIgnoreCase);

또는

if (StringA.Equals(StringB, StringComparison.CurrentCultureIgnoreCase)) {

그러나 문자열 A가 null이 아닌지 확인해야 합니다.그래서 아마도 더 잘 사용할 수 있을 것입니다.

string.Equals(StringA , StringB, StringComparison.CurrentCultureIgnoreCase);

존의 제안대로

편집: 버그 수정

사용할 수 있습니다.

if (stringA.equals(StringB, StringComparison.CurrentCultureIgnoreCase))

교환원?아니요, 하지만 문자열 비교가 대소문자를 구분하지 않도록 문화를 변경할 수 있다고 생각합니다.

// you'll want to change this...
System.Threading.Thread.CurrentThread.CurrentCulture
// and you'll want to custimize this
System.Globalization.CultureInfo.CompareInfo

저는 동등한 연산자가 문자열을 비교하는 방식을 바꿀 것이라고 확신합니다.

여기 구문을 단순화하는 아이디어가 있습니다.

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

나는 이러한 비교 방법의 끝에 있는 타이핑에 매우 익숙합니다., StringComparison.

그래서 연장을 했습니다.

namespace System
{   public static class StringExtension
    {
        public static bool Equals(this string thisString, string compareString,
             StringComparison stringComparison)
        {
            return string.Equals(thisString, compareString, stringComparison);
        }
    }
}

다음 날짜에 Null을 확인해야 합니다.thisString다음 전화를 걸기 전에.

string.Compare(string1, string2, true)

다른 답변은 여기서 완전히 유효하지만, 어떻게든 입력하는 데 시간이 걸립니다.StringComparison.OrdinalIgnoreCase그리고 또한 사용합니다.String.Compare.

비교가 대소문자를 구분하는지 아니면 불리언과 대소문자를 구분하지 않는지 지정할 수 있는 간단한 문자열 확장 방법을 코딩했습니다. 다음 답변을 참조하십시오.

https://stackoverflow.com/a/49208128/2338477

if (StringA.ToUpperInvariant() == StringB.ToUpperInvariant()) {

사람들이 상위 불변량()이 하위 변동량보다 빠르다고 보고함불변().

언급URL : https://stackoverflow.com/questions/631233/is-there-a-c-sharp-case-insensitive-equals-operator

반응형