2009-12-10 4 views
2

나는이 두 줄이 동일하다고 생각하지만 이상한 문제에 빠진 후에 더 이상이 경우라고 생각하지 않습니다.문자열 비교 동등 물

context.Request.ContentType.ToLower().Equals("text/xml") 

자신의 구현이 CLR에서 어떤 다른 위치 :

String mimeType = context.Request.ContentType; 
(String.Compare("text/xml", mimeType, true) == 0)) 

는 같은 것입니까?

답변

5

이들은 완전히 동일하지 않습니다. here을 참조하십시오. 는 소문자 사본에 대해 별도의 문자열을 할당하지 않습니다를 변경할 수 없기이 방법도 효율적입니다

bool areSame = str1.Equals(str2, StringComparison.OrdinalIgnoreCase); 

:

는 여기에 대소 문자를 구분 비교를 할 수있는 올바른 방법입니다. .NET에서

+2

이 경우는 99.999 %의 경우 작동하지만 몇 번 실패 할 수 있습니다. 'The Turkish-I Problem'을 참조하십시오. http://msdn.microsoft.com/en-us/library/ms973919.aspx – Gonzalo

+0

@SLaks : 요점은 무엇인지 모르겠지만 'OrdinalIgnoreCase'는 터키어를 해결하지 못합니다. - 문제가있어. –

+0

@Pavel : 나는 그것을 몰랐다. 감사. – SLaks

0

비교 (문자열, 문자열, 부울)의 구현 :

public static int Compare(string strA, string strB, bool ignoreCase) 
{ 
    if (ignoreCase) 
    { 
     return CultureInfo.CurrentCulture.CompareInfo.Compare(strA, strB, CompareOptions.IgnoreCase); 
    } 
    return CultureInfo.CurrentCulture.CompareInfo.Compare(strA, strB, CompareOptions.None); 
} 

하고 그래서

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] 
public bool Equals(string value) 
{ 
    if ((value == null) && (this != null)) 
    { 
     return false; 
    } 
    return EqualsHelper(this, value); 
} 

같음은, NOT 같은 일 입니다.

6

해당 사항이 아니며 ToLower/ToUpper는 일부 현지화 문제가있을 수 있습니다.

bool areEqual = String.Equals(str1, str2, StringComparison.OrdinalIgnoreCase); 
+0

안전한 'null'처리 때문에 선호하는 버전이지만 다른 대답에 대한 Gonzalo의 의견도 여기에 적용되므로이를 고려해야합니다. –

1

에서 : 대소 문자 구분없이 두 문자열을 비교하는 방법 (문자열 중 하나를 고려하는 것은 내가 str1.Equals 방법을 좋아하지 않는 이유는, null의 경우도있다)는 정적 String.Equals 방법입니다 또한 다른 답변 (@ SLaks, @Serhio)에 덧붙여, 나는 또한 지적해야한다고 느낀다 .ToLower()는 또 다른 문자열을 생성한다. 비교는 내가 아는 한 멀리 있지 않습니다. 앱에서 과도한 문자열 생성은 자주 호출되는 코드에있는 경우 메모리 사용 및 성능 측면에서 다시 한 번 물어볼 수 있습니다.

+0

나는 그것을 지적했다. (마지막 줄에) – SLaks

+0

Hehe ... 이제 그것을 보아라. .. –