मुझे पता है कि निम्नलिखित मामला संवेदनशील है:
if (StringA == StringB) {
तो क्या कोई ऑपरेटर है जो असंवेदनशील तरीके से दो तारों की तुलना करेगा?
~=
समानांतर से संबंधित परिभाषित करने के लिए ==
।
मुझे पता है कि निम्नलिखित मामला संवेदनशील है:
if (StringA == StringB) {
तो क्या कोई ऑपरेटर है जो असंवेदनशील तरीके से दो तारों की तुलना करेगा?
~=
समानांतर से संबंधित परिभाषित करने के लिए ==
।
जवाबों:
इसे इस्तेमाल करे:
string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);
if A$=B$ then goto 10
" का उपयोग कर सकता हूं
सबसे अच्छा तरीका है पत्र के मामले की अनदेखी 2 तार की तुलना करने का उपयोग है String.Equals स्थिर विधि को निर्दिष्ट एक क्रमसूचक मामले स्ट्रिंग तुलना ध्यान न दें। यह सबसे तेज़ तरीका भी है, जो स्ट्रिंग्स को लोअर या अपर केस में बदलने और उसके बाद उनकी तुलना करने से बहुत तेज़ है।
मैंने दोनों दृष्टिकोणों के प्रदर्शन का परीक्षण किया और क्रमिक अनदेखी मामले की स्ट्रिंग तुलना 9 गुना अधिक तेज थी ! यह स्ट्रिंग्स को लोअर या अपर केस में परिवर्तित करने से भी अधिक विश्वसनीय है (तुर्की मैं समस्या की जाँच करें)। तो हमेशा उपयोग 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
।
या
if (StringA.Equals(StringB, StringComparison.CurrentCultureIgnoreCase)) {
लेकिन आपको यह सुनिश्चित करने की आवश्यकता है कि स्ट्रिंगिंग अशक्त नहीं है। तो शायद बेहतर ट्यू उपयोग:
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
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
एक्सट्रा कॉलिंग से पहले आपको नल की जांच करनी होगी ।
if (StringA.ToUpperInvariant() == StringB.ToUpperInvariant()) {
लोग रिपोर्ट करते हैं ToUpperInvariant () ToLowerInvariant () से तेज़ है।
अन्य उत्तर पूरी तरह से यहां मान्य हैं, लेकिन किसी तरह टाइप करने StringComparison.OrdinalIgnoreCase
और उपयोग करने में भी कुछ समय लगता है String.Compare
।
मैंने सरल स्ट्रिंग एक्सटेंशन पद्धति को कोडित किया है, जहां आप यह निर्दिष्ट कर सकते हैं कि अगर तुलना संवेदनशील है या बूलियन के साथ मामला संवेदनहीन है - निम्नलिखित उत्तर देखें: