मैं एक मामले को असंवेदनशील स्ट्रिंग तुलना कैसे कर सकता हूं?


217

मैं मामले को असंवेदनशील कैसे बना सकता हूं?

drUser["Enrolled"] = 
      (enrolledUsers.FindIndex(x => x.Username == (string)drUser["Username"]) != -1);

आज मुझे पहले कुछ सलाह दी गई थी, जिसमें मैंने सुझाव दिया:

x.Username.Equals((string)drUser["Username"], StringComparison.OrdinalIgnoreCase)));

मुसीबत यह है कि मैं इसे काम नहीं कर सकता, मैंने नीचे की लाइन की कोशिश की है, यह संकलन करता है लेकिन गलत परिणाम देता है, यह नामांकित उपयोगकर्ताओं को अनियंत्रित और अनियंत्रित उपयोगकर्ताओं को नामांकित के रूप में देता है।

drUser["Enrolled"] = 
      (enrolledUsers.FindIndex(x => x.Username.Equals((string)drUser["Username"], 
                                 StringComparison.OrdinalIgnoreCase)));

किसी को भी समस्या को इंगित कर सकते हैं?


1
क्या डेटा प्रकार होना drUser["Enrolled"]चाहिए? यह एक बूलियन मूल्य जैसा दिखता है, लेकिन FindIndex()सूचकांक को लौटाता है। यदि उस उपयोगकर्ता का सूचकांक 0 है, तो यह 0 वापस आ जाएगा, जो कि गलत हो सकता है। जब, वास्तव में सच है। Exists()विधि इस मामले में बेहतर हो सकता है।
23

क्या आप सुनिश्चित हैं कि किसी एक क्षेत्र में स्वरूपण या अतिरिक्त स्थान नहीं है जो दूसरे में नहीं है?
जनवरी को joshlrogers

1
मैं FindIndex (और परीक्षण) के बजाय nomUsers.Any () का उपयोग करने का सुझाव दूंगा।
मार्क

जवाबों:


405

यह समानता की जांच करने के लिए .NET फ्रेमवर्क (4 & +) में सबसे अच्छा अभ्यास नहीं है

String.Compare(x.Username, (string)drUser["Username"], 
                  StringComparison.OrdinalIgnoreCase) == 0

इसके बजाय निम्नलिखित का उपयोग करें

String.Equals(x.Username, (string)drUser["Username"], 
                   StringComparison.OrdinalIgnoreCase) 

MSDN अनुशंसा करता है:

  • दो स्ट्रिंग समान हैं या नहीं, यह जाँचने के लिए String.Equals पद्धति का अधिभार का उपयोग करें।
  • String.Compare और String.CompareTo विधियों का उपयोग स्ट्रिंग्स को सॉर्ट करने के लिए करें, समानता की जांच करने के लिए नहीं

8
आपको उपयोग करना चाहिए string.Compare, नहीं String.Compare
फ्रेड

5
@ मैं सहमत हूँ लेकिन क्या आप इसका कारण बता सकते हैं?
Gusdor

22
@ मुझे लगता है कि 'स्टाइलकॉप ऐसा कहता है' के बजाय एक तकनीकी कारण की उम्मीद कर रहा था। क्या मैं कुछ भूल रहा हूँ?
Gusdor

12
String.Compare, स्ट्रिंग समानार्थी शब्द System.String वर्ग के साथ कोई अंतर नहीं। और सदस्य तुलना एक विस्तार विधि है। @ Fred @Gusdor
Nuri YILMAZ

23
@Gusdor एक भाषा कीवर्ड के stringबजाय बेहतर अभ्यास है String। एक के लिए,String इसके अलावा कुछ हो सकता है System.String, जबकि stringनहीं हो सकता है। साथ ही, stringC # में मौजूद होने की अधिक या कम गारंटी है, जबकि Stringतकनीकी रूप से C # के बजाय .NET का हिस्सा है।
डेव कजिनो

36

आपको String.Compareनिम्नलिखित की तरह स्थिर फ़ंक्शन का उपयोग करना चाहिए

x => String.Compare (x.Username, (string)drUser["Username"],
                     StringComparison.OrdinalIgnoreCase) == 0

6
नहीं, आपको String.Equalsइसके बजाय उपयोग करना चाहिए String.Compare। यह गणना करने की कोई आवश्यकता नहीं है कि कौन सा अधिक है, बस यह नहीं है कि वे समान नहीं हैं।
एरिक

@ एरिक: मुझे आश्चर्य है, कि आप किस विधि का उपयोग 6 साल में अधिक करने की सिफारिश करेंगे :-)
ओलेग

3
मुझे आश्चर्य नहीं है! मुझे विश्वास है कि जब आप समानता शब्दार्थ चाहते हैं तो मैं समानता का उपयोग करने की सलाह दूंगा और जब आप तुलनात्मक शब्दार्थ चाहते हैं तो तुलना का उपयोग कर सकते हैं। उसके बारे में इतना मुश्किल क्या है? IEquatableऔर IComparableएक ही काम न करें, और आपके पास ऐसी कक्षाएं हो सकती हैं जो एक को लागू करती हैं लेकिन जिसमें दूसरे को लागू करने के लिए कोई अर्थ नहीं होता है। उदाहरण के लिए, आप समय के बिना सेंसर के नमूने का आदेश दे सकते हैं, उनमें से कोई भी समान (IComparable) नहीं है। और, आप इंगित कर सकते हैं कि क्या चीजें समान हैं (IEquatable) लेकिन यह उन्हें (जैसे, कंप्यूटर सीरियल नंबर) ऑर्डर करने के लिए कोई मतलब नहीं है।
एरिक

@ विदेश: आप मेरी बात नहीं समझते। पुराने उत्तर लेखन के समय से मेल खाते हैं। किसी को पुराने उत्तरों को नहीं छूना चाहिए। यह सबसे उत्पादों के बारे में सच है। सबसे अच्छा अभ्यास या प्रदर्शन के दृष्टिकोण से सबसे अच्छा विकल्प बाद में कई बार बदला जा सकता है। मुझे किसी पुराने उत्तर के बारे में चर्चा करने का कोई मतलब नहीं है।
ओलेग

18
मेरी क्षमा याचना, मैंने अपनी टिप्पणी की शुद्धता पर इसे एक आलोचना के रूप में लिया। यदि आप जो कह रहे हैं कि आप स्वीकार करते हैं कि आपका पुराना उत्तर सबसे अच्छा नहीं हो सकता है, तो महान! हालाँकि, मुझे पुराने उत्तरों के बारे में आपसे असहमत होना होगा। पुराना जवाब है कि गरीब जानकारी देने चाहिए पर टिप्पणी की जा, चाहिए -मतदान नीचे, क्योंकि वे अभी भी जानकारी दे रहे हैं हो सकता है आज के पाठकों।
एरिक

27

तुलना के लिए कृपया इसका उपयोग करें:

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

10
बस CurrentCultureIgnoreCase बनाम OrdinalIgnoreCase का उपयोग करने के फायदे और नुकसान से अवगत रहें। यदि आपको संस्कृति तुलना के शब्दार्थ की आवश्यकता नहीं है, तो कुछ प्रदर्शन को बचाएं और क्रमिक तुलना का उपयोग करें।
एरिक

7

दूसरों के जवाब यहां पूरी तरह से मान्य हैं, लेकिन किसी तरह टाइप करने StringComparison.OrdinalIgnoreCaseऔर उपयोग करने में भी कुछ समय लगता है String.Compare

मैंने सरल स्ट्रिंग एक्सटेंशन विधि को कोडित किया है, जहां आप यह निर्दिष्ट कर सकते हैं कि अगर तुलना संवेदनशील है या बूलियन के साथ मामला संवेदनहीन है, तो पूरे कोड स्निपेट को यहां संलग्न करें:

using System;

/// <summary>
/// String helpers.
/// </summary>
public static class StringExtensions
{
    /// <summary>
    /// Compares two strings, set ignoreCase to true to ignore case comparison ('A' == 'a')
    /// </summary>
    public static bool CompareTo(this string strA, string strB, bool ignoreCase)
    {
        return String.Compare(strA, strB, ignoreCase) == 0;
    }
}

उस पूरी तुलना के बाद लगभग 10 वर्णों को छोटा करता है - तुलना करें:

स्ट्रिंग एक्सटेंशन का उपयोग करने से पहले:

String.Compare(testFilename, testToStart,true) != 0

स्ट्रिंग एक्सटेंशन का उपयोग करने के बाद:

testFilename.CompareTo(testToStart, true)

2
मैं नामकरण से असहमत हूं, तुलना सॉफ्टवेयर देव में एक प्रसिद्ध कार्य है और आपने मौलिक रूप से इसे बदल दिया है। मुझे लगता है कि आपको या तो किसी इंट की तरह लौटना चाहिए या नाम को किसी और चीज़ में बदलना होगा, उदाहरण के लिए 'इस्क्वाल'।
फ्रेड

7

System.Stringकेस असंवेदनशील तुलना विस्तार विधि प्रदान करने के लिए आप (हालांकि विपरीत ) विस्तार कर सकते हैं:

public static bool CIEquals(this String a, String b) {
    return a.Equals(b, StringComparison.CurrentCultureIgnoreCase);
}

और इस तरह का उपयोग करें:

x.Username.CIEquals((string)drUser["Username"]);

C # आपको विस्तार विधियाँ बनाने की अनुमति देता है जो आपके प्रोजेक्ट में सिंटैक्स शर्करा के रूप में काम कर सकती हैं, काफी उपयोगी मैं कहूँगा।

यह जवाब नहीं है और मुझे पता है कि यह सवाल पुराना और हल है, मैं बस इन बिट्स को जोड़ना चाहता था।


3

मुझे लगता है कि आपको इस लिंक में अधिक जानकारी मिलेगी:

http://codeidol.com/community/dotnet/controlling-case-sensitivity-when-comparing-two-st/8873/

दो तारों की तुलना करने के लिए स्ट्रिंग वर्ग पर तुलनात्मक विधि का उपयोग करें। चाहे तुलना मामले-असंवेदनशील हो, उसके एक अधिभार के तीसरे पैरामीटर द्वारा निर्धारित की जाती है। उदाहरण के लिए:

string lowerCase = "abc";
string upperCase = "AbC";
int caseInsensitiveResult = string.Compare(lowerCase, upperCase,
  StringComparison.CurrentCultureIgnoreCase);
int caseSensitiveResult = string.Compare(lowerCase,
  StringComparison.CurrentCulture);

CaseSensitiveResult मान -1 है (यह दर्शाता है कि लोअरकेस "" अपरकेस से कम है) और CaseInsensitiveResult शून्य है (यह दर्शाता है कि लोअरकेस "अपरकेस" के बराबर है)।


1

StringComparison.CurrentCultureIgnoreCaseइसके बजाय का उपयोग कैसे करें ?


5
-1: यह उत्तर अपर्याप्त है। @ Ocean4dream का जवाब कृपया देखें: stackoverflow.com/a/13965429/109941
जिम जी।

@ डाईसाइक्लोन: यह ऑर्डिनलइग्नोरकेस की तुलना में धीमा है, लेकिन शायद कुछ मामलों में प्रासंगिक है। इसलिए मैं -1 नहीं दूंगा। stackoverflow.com/questions/2749662/…
Csaba Toth

इसके अलावा stackoverflow.com/questions/72696/…
Csaba Toth

1

मैं EqualsIgnoreCase के लिए एक विस्तार विधि लिखना चाहता हूं

public static class StringExtensions
{
    public static bool? EqualsIgnoreCase(this string strA, string strB)
    {
        return strA?.Equals(strB, StringComparison.CurrentCultureIgnoreCase);
    }
}

-11

आप हमेशा फ़ंक्शन का उपयोग कर सकते हैं: .ToLower (); .ToUpper ();

अपने तार बदलें और फिर उनकी तुलना करें ...

शुभ लाभ


मुझे नहीं लगता कि इससे उनकी समस्या का समाधान होगा। यह भी चिह्नित करें कि यह प्रश्न पहले से ही 4 साल से अधिक पुराना है।
वोजत दोहल

7
यह एक नया स्ट्रिंग बनाता है, इसलिए मैं इसे बहुत अक्षम मानता हूं। क्योंकि इस नए स्ट्रिंग को बनाने के लिए सभी वर्णों की जाँच की जाएगी और वांछित मामले में परिवर्तित किया जाएगा, फिर तुलना को सभी वर्णों को फिर से जांचना होगा। इसलिए यह अधिक मेमोरी और प्रोसेसिंग पावर का उपयोग करता है।
Air2

5
मेमोरी आवंटन के कारण यह बहुत बुरा अभ्यास है।
Thorbjørn Lindeijer

इतना ही नहीं यह अनावश्यक मेमोरी आवंटन और अक्षम है; यह भी तुर्की परीक्षण में विफल रहता है ।
दिमित्री
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.