C# में .Contains() बिना रजिस्टर के: 2025 के 5 सर्वश्रेष्ठ तरीके

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

सामान्य .Contains() आपको क्यों निराश करेगा (और इसे कैसे ठीक करें)

\n\n

कल्पना करें: आप C# में पुस्तकों की एक सूची में खोज लिख रहे हैं। उपयोगकर्ता "Толстой" टाइप करता है, जबकि डेटाबेस में छोटे अक्षरों में "толстой" संग्रहीत है। सामान्य string.Contains("Толстой") false लौटाएगा। यह दर्द परिचित है? इस प्रश्न ने Stack Overflow पर हज़ारों बार देखा गया है — और यह सही भी है। 2025 में, जब .NET स्ट्रिंग्स के साथ काम करने के लिए शक्तिशाली उपकरण प्रदान करता है, पुराने दृष्टिकोण का उपयोग करने का मतलब है उपयोगकर्ताओं और प्रदर्शन को खोना।

\n\n

इस लेख में, हम C# में .Contains() को केस-इनसेंसिटिव बनाने के 5 सर्वश्रेष्ठ तरीकों पर चर्चा करेंगे। आप जानेंगे कि अधिकतम गति के लिए कौन सी विधि चुननी है, और विभिन्न भाषाओं के साथ सही काम करने के लिए कौन सी। चलिए शुरू करते हैं!

\n\n

समस्या: डिफ़ॉल्ट रूप से .Contains() केस सेंसिटिव क्यों है?

\n\n

C# में, string.Contains() विधि डिफ़ॉल्ट रूप से Ordinal तुलना का उपयोग करती है। इसका मतलब है कि वर्णों की तुलना बाइट-दर-बाइट की जाती है: 'A' (0x41) 'a' (0x61) के बराबर नहीं है। अंग्रेज़ी सामग्री के लिए यह अक्सर ठीक होता है, लेकिन बहुभाषी अनुप्रयोगों (रूसी, जर्मन, तुर्की) में यह दृष्टिकोण खोज तर्क को तोड़ देता है।

\n\n

उदाहरण के लिए, तुर्की भाषा में अपरकेस में 'i' अक्षर 'İ' है, न कि 'I'। सामान्य ToLower() गलत परिणाम दे सकता है। इसलिए केवल text.ToLower().Contains(pattern.ToLower()) कॉल करना एक बुरी प्रथा है। आइए आधुनिक समाधानों पर नज़र डालें।

\n\n

विधि 1: StringComparison.OrdinalIgnoreCase — आपका नया मानक

\n\n

.NET 5 से शुरू (और .NET 8/9 में बढ़िया काम करता है), सबसे तेज़ और सुरक्षित तरीका StringComparison पैरामीटर के साथ Contains ओवरलोड का उपयोग करना है:

\n\n
string text = "Война и мир — Лев Толстой";\nstring searchTerm = "толстой";\n\nbool result = text.Contains(searchTerm, StringComparison.OrdinalIgnoreCase);\nConsole.WriteLine(result); // True
\n\n

यह सबसे अच्छा विकल्प क्यों है?

\n
    \n
  • गति: OrdinalIgnoreCase बाइट स्तर पर काम करता है, लेकिन रजिस्टर को अनदेखा करता है। यह CurrentCultureIgnoreCase से 2-3 गुना तेज़ है।
  • \n
  • पूर्वानुमेयता: उपयोगकर्ता की संस्कृति पर निर्भर नहीं करता। "ß" (जर्मन Eszett) "ss" के बराबर नहीं होगा, जब तक आप ऐसा नहीं चाहते।
  • \n
  • समर्थन: .NET के सभी आधुनिक संस्करणों (Core 2.1+) में उपलब्ध।
  • \n
\n\n

इस विधि का उपयोग करें जब आपको बिना रजिस्टर के सरल तुलना की आवश्यकता हो, और आप भाषाई विशेषताओं (सॉर्टिंग, विभक्तियाँ) के साथ काम नहीं कर रहे हों।

\n\n

विधि 2: IndexOf() StringComparison के साथ — यदि अधिक नियंत्रण की आवश्यकता हो

\n\n

कभी-कभी आपको केवल उपस्थिति की जाँच करने की नहीं, बल्कि प्रविष्टि की स्थिति जानने की आवश्यकता होती है। या आप .NET Framework के पुराने संस्करणों के साथ काम कर रहे हैं, जहाँ StringComparison के साथ Contains उपलब्ध नहीं है। तब IndexOf() मदद करता है:

\n\n
string text = "C# — лучший язык для backend";\nstring searchTerm = "Лучший";\n\nbool result = text.IndexOf(searchTerm, StringComparison.OrdinalIgnoreCase) >= 0;\nConsole.WriteLine(result); // True\n\n// और यदि स्थिति प्राप्त करनी हो:\nint index = text.IndexOf(searchTerm, StringComparison.OrdinalIgnoreCase);\nConsole.WriteLine(index); // 4 (वह स्थिति जहाँ से शब्द शुरू होता है)
\n\n

कब उपयोग करें:

\n
    \n
  • पुरानी परियोजनाओं में (जैसे, .NET Framework 4.x)।
  • \n
  • जब प्रविष्टि का इंडेक्स खोजना हो, न कि केवल उपस्थिति की जाँच करनी हो।
  • \n
  • अधिक जटिल परिदृश्यों के लिए (जैसे, वर्णों को छोड़कर खोज)।
  • \n
\n\n

महत्वपूर्ण: IndexOf -1 लौटाता है यदि सबस्ट्रिंग नहीं मिलती है। हमेशा >= 0 पर जाँच करें, न कि > 0 पर।

\n\n

विधि 3: CultureInfo.CurrentCultureIgnoreCase — भाषाई रूप से सही खोज के लिए

\n\n

यदि आपका एप्लिकेशन ध्यान में रखना चाहिए

ब्लॉग

पुस्तक अनुशंसाएँ