2010-06-24 12 views
50

हमें मान लीजिए की अनदेखी करने के मैं इस कोड हैकैसे सूची में केस संवेदनशीलता <string>

string seachKeyword = ""; 
List<string> sl = new List<string>(); 
sl.Add("store"); 
sl.Add("State"); 
sl.Add("STAMP"); 
sl.Add("Crawl"); 
sl.Add("Crow"); 
List<string> searchResults = sl.FindAll(s => s.Contains(seachKeyword)); 

मैं कैसे पत्र मामले को अनदेखा कर सकते में खोज शामिल?

धन्यवाद,

उत्तर

61

तुलना सबसे अच्छा विकल्प क्रमसूचक केस-संवेदी तुलना का उपयोग करेंगे लिख रहा है, फिर भी Contains विधि इसका समर्थन नहीं करता।

ऐसा करने के लिए निम्न का उपयोग कर सकते हैं:

sl.FindAll(s => s.IndexOf(searchKeyword, StringComparison.OrdinalIgnoreCase) >= 0); 

बेहतर होगा कि इस तरह के रूप एक विस्तार विधि में इस रैप करने के लिए,:

public static bool Contains(this string target, string value, StringComparison comparison) 
{ 
    return target.IndexOf(value, comparison) >= 0; 
} 

तो तुम इस्तेमाल कर सकते हैं:

sl.FindAll(s => s.Contains(searchKeyword, StringComparison.OrdinalIgnoreCase)); 
+1

इसका मतलब यह नहीं चाहेंगे कि ओपी के सवाल में सूची दी, कि 'sl.FindAll (रों => s.Contains (" स्टेट ", StringComparison.OrdinalIgnoreCase));' वापसी होगी ' TRUE'? कल्पनीय सही होने पर, मैं 'सूची ' पर एक सूची पसंद करूंगा जो केवल तभी सत्य लौटाएगा जब दोनों स्ट्रिंग्स की लंबाई बराबर होती है, भले ही कोई व्यक्ति जो सही लौटाता है, 'सूची ' में एक स्ट्रिंग है जिसमें खोज है पैरामीटर। तो ... 'वापसी लक्ष्य। इंडेक्सऑफ (मूल्य, तुलना)> = 0 && target.Length == मान। लम्बाई;' – GCymbala

+0

+2 यदि मैं कर सकता था। वास्तव में मुझे क्या चाहिए –

-1

संभव में से एक (सबसे अच्छा नहीं हो सकता है), तो आप तार sl में डाल के सभी लोअरकेस है। फिर आप खोज कीवर्ड को कम करें।

एक अन्य समाधान एक और तरीका है कि 2 स्ट्रिंग पैरामीटर लोअरकेस और उन्हें

6

इष्टतम समाधान तुलना करते समय मामले को अनदेखा करना होगा

List<string> searchResults = sl.FindAll(s => s.IndexOf(seachKeyword, System.StringComparison.OrdinalIgnoreCase) >= 0); 
68

उपयोग Linq, यह एक नई विधि .Compare को

using System.Linq; 
using System.Collections.Generic; 

List<string> MyList = new List<string>(); 
MyList.Add(...) 
if (MyList.Contains(TestString, StringComparer.CurrentCultureIgnoreCase)) { 
    //found 
} 

तो शायद

using System.Linq; 
... 

List<string> searchResults = sl.FindAll(s => s.Contains(seachKeyword, StringComparer.CurrentCultureIgnoreCase)); 
+2

आह! मैं गलती पर स्ट्रिंग कॉम्पर्सन का उपयोग कर रहा था! धन्यवाद! –

+0

बस एक नोट: यह काम नहीं करेगा - एक पाठ परिदृश्य में एक शब्द खोजें क्योंकि इसमें पूर्ण पाठ की खोज होगी। बेशक यह प्रश्न में एक परिदृश्य नहीं है और आपका उत्तर पूरी तरह से काम करता है। :) –

+1

@ अंकुर-एम शायद आप इसके लिए रेगेक्स चाहते हैं। अब आपके पास 2 समस्याएं हैं। –

5
StringComparer.CurrentCultureIgnoreCase is a better approach instead of using indexOf. 
+0

"इंडेक्सऑफ का उपयोग करने के बजाय एक बेहतर दृष्टिकोण है।" वास्तव में वास्तव में क्यों? –

0

आप इस पर थोड़ा चाल आवेदन कर सकते हैं कहते हैं।
बदलें सभी स्ट्रिंग इसी मामले रहे हैं: या तो अपर या लोअर केस

सूची खोज-= sl.FindAll (रों =>s.ToUpper() .Contains (seachKeyword.ToUpper()));

0

आप में से उन लोगों के लिए सूची की सूची के माध्यम से खोज करने में समस्याएं हैं, मुझे एक समाधान मिला।

इस उदाहरण में मैं एक जाली सूची के बावजूद खोज रहा हूं और केवल उन सूचियों को पकड़ रहा हूं जिनके पास तर्क से मेल खाने वाली पहली स्ट्रिंग है।

List<List<string>> TEMPList = new List<List<string>>(); 

TEMPList = JaggedList.FindAll(str => str[0].ToLower().Contains(arg.ToLower())); 

DoSomething(TEMPList); 
0

FindAll संपूर्ण सूची का गणना करता है।

पहला उदाहरण खोजने के बाद बेहतर दृष्टिकोण तोड़ना होगा।

बूल मिला = सूची। फर्स्टऑर्डडिफॉल्ट (x => स्ट्रिंग। एक्वाल्स (एक्स, सर्चकीवार्ड, स्ट्रिंगकोपरिसन। ऑर्डिनल इग्नोरकेस)!= शून्य;

12

तुम इतनी तरह केस-संवेदी स्ट्रिंग समानता comparer प्रदान करके Contains का उपयोग कर सकते

if (myList.Contains(keyword, StringComparer.OrdinalIgnoreCase)) 
{ 
    Console.WriteLine("Keyword Exists"); 
} 
+0

नोट आपको "system.Linq का उपयोग कर" linq शामिल करने की आवश्यकता है नोट करें –

+0

यह सबसे आसान जवाब है और ठीक काम करता है। –

+0

यह वास्तविक उत्तर –

0

विधि नीचे अपनी जरूरत कीवर्ड खोज करेंगे और सम्मिलित सभी एक नई सूची में आइटम की खोज और उसके बाद नई सूची देता है।

private List<string> serchForElement(string searchText, list<string> ListOfitems) 
{    
    searchText = searchText.ToLower(); 
    List<string> Newlist = (from items in ListOfitems 
         where items.ToLower().Contains(searchText.ToLower()) 
         select items).ToList<string>(); 

नई सूची लौटें; }

+1

है आपके कोड की व्याख्या शामिल करना बेहतर होगा। –

+0

"ListOfitems" आपकी सूची है। searchText खोज करने के लिए कीवर्ड है। मैंने जो गलती की है वह दो बार कम मामला कर रहा है। इसकी आवश्यकता दो बार नहीं है। –

संबंधित मुद्दे