2013-07-27 6 views
6

मेरे पास कुछ शब्दों के साथ List<string> है। मैं सभी तत्वों को प्राप्त करना चाहता हूं, चुड़ैल में इस स्कीमा में अक्षर हैं: a00b0c000d - 0 यादृच्छिक चार, a,b,c,d है - लगातार स्ट्रिंग में वर्ण हैं।अक्षरों को देखकर सूची सी #

मैं यह कैसे कर सकता हूं? क्या मैं केवल रेगेक्स के साथ ऐसा कर सकता हूं? कोई अन्य समाधान नहीं है?

उत्तर

5

ठीक है, एक regex के बजाय आप संबंधित पदों में विशिष्ट पात्रों के लिए जाँच करने के लिए LINQ का उपयोग कर सकते हैं। लेकिन मैं निश्चित रूप से एक नियमित अभिव्यक्ति पसंद करेंगे।

var result = yourList 
    .Where(x => x[0] == "a") 
    .Where(x => x[3] == "b") 
    .Where(x => x[5] == "c") 
    .Where(x => x[9] == "d") 
    .ToList(); 
2

ठीक है, आप Regex और LINQ के साथ यह कर सकते हैं:

Regex yourRegex = new Regex(@"a..b.c...d"); 
//if you want whole string match use ^a..b.c...d$ 
var result = yourList.Where(yourRegex.IsMatch); 
+0

वहाँ नहीं शुरू किया जाना चाहिए और पंक्ति के अंत एंकर '^' और '' $ वहाँ में इस्तेमाल किया, मामले में सूची किसी भी (गलत?) अब तार भी शामिल है? –

+0

@ ओआर.मैपर ने कहा कि इसमें शामिल है, इसलिए मुझे लगता है कि वह नहीं करता है। हालांकि, मैं इसे एक विकल्प के रूप में जोड़ दूंगा। –

+1

आह, सच - इस सवाल के आधार पर कि कैसे प्रश्न का अर्थ है (और कुछ उत्तरों ने इसे इस तरह व्याख्या किया), कोई भी "विशिष्ट स्थितियों पर" पढ़ सकता है - वास्तव में, आपके समाधान ने पात्रों के विशिष्ट सापेक्ष पदों को भी माना, स्ट्रिंग सीमाओं के संबंध में बिल्कुल पूर्ण नहीं है। –

1

आप सूची के माध्यम से लूपिंग के बाद स्ट्रिंग के लिए IndexOfAny() विधि का उपयोग कर सकते हैं। IndexOfAny कई मानों के लिए एक स्ट्रिंग की खोज करता है।

List<string> words = new List<string>(); 
foreach(string word in words) 
{ 
    int match = word.IndexOfAny(new char[] {'a', 'b', 'c', 'd'}); 
    if(match!=-1) 
    { 
     //Processing Logic here 
    } 
    } 
  • यह यूनिकोड वर्ण की एक निर्दिष्ट सरणी में किसी भी चरित्र के इस उदाहरण में पहली घटना के सूचकांक की रिपोर्ट।
  • विधि 1 लौटाता है यदि सरणी में वर्ण इस उदाहरण में नहीं पाए जाते हैं।
+0

परिभाषा के अनुसार, इंडेक्सऑफएनी सिर्फ पहले मिले इंडेक्स को वापस नहीं करेगा? या यह अभी भी दिए गए पैरामीटर के अंदर हर चरित्र की जांच करता है? – KappaG3

0

Regex का उपयोग करके बिना, आप शायद

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

     foreach (var s in stromgs) 
     { 
      var sa = s.Select(c => c.ToString(CultureInfo.InvariantCulture)).ToArray(); 

      if (sa.Contains("a") && sa.Contains("b") && sa.Contains("c") && sa.Contains("d")) 
       yield return s; 
     } 

की तर्ज पर कुछ करने के परिणाम आप के बाद कर रहे हैं प्राप्त करने के लिए कर सकता है। मैंने इस कोड को प्रोफाइल नहीं किया है, इसलिए मुझे पता है कि यह नियमित रूप से अभिव्यक्तियों का उपयोग करने से बहुत धीमा हो सकता है, लेकिन इसे आपको रेगेक्स से पूरी तरह से बचने का एक तरीका देना चाहिए (जो कुछ मैं आमतौर पर करता हूं)।

1

सूची में फिर से प्रयास करने का एक प्रभावी तरीका होगा।

List<string> matches = new List<string>(); 
myList.ForEach((x) => { if(x[0] == 'a' && x[3] == 'b' && x[5] == 'c' && x[9] == 'd') matches.Add(x); }); 

या आप LINQ का उपयोग कर सकते हैं जो थोड़ा धीमा हो सकता है लेकिन बाधा होने की संभावना नहीं है।

var matches = myList.Where(x => x[0] == 'a' && x[3] == 'b' && x[5] == 'c' && x[9] == 'd').ToList(); 
संबंधित मुद्दे