2010-08-13 5 views
9

से संख्याओं को पार्स करने के लिए LINQ का उपयोग करना क्या एक प्रश्न लिखना संभव है जहां हमें उन सभी पात्रों को प्राप्त किया जाता है जिन्हें किसी दिए गए स्ट्रिंग से int में पार्स किया जा सकता है? "$%^DDFG 6 7 23 1"स्ट्रिंग

परिणाम होना चाहिए "67231"

और यहां तक ​​कि मामूली कठिन:

उदाहरण के लिए हम इस तरह की स्ट्रिंग है हम केवल पहले तीन नंबर मिल सकता है?

+2

सटीक आवश्यकता पूरी तरह स्पष्ट नहीं है, क्या एक स्ट्रिंग like'123abc456def' साथ क्या होगा, आप '123456' वापस जाने के लिए चाहते हैं,' 123' और '456', सिर्फ '123' या शायद' 1' और '2' और' 3' आदि? सबसे अच्छा तरीका सटीक spec पर निर्भर करता है। –

+2

@ पॉल यह पहले तीन नंबर कहता है। यह संभवतः अधिक सटीक कैसे हो सकता है? हो सकता है कि आप मुझे चश्मे के 300 पृष्ठों और आरेखों के समूह के साथ किसी प्रकार की व्यावसायिक योजना लिखना चाहें? :) – Agzam

उत्तर

20

यह आपको अपनी स्ट्रिंग

string result = new String("y0urstr1ngW1thNumb3rs". 
    Where(x => Char.IsDigit(x)).ToArray()); 

दे और होगा के लिए पहले 3 वर्ण से पहले ToArray()

+2

मुझे याद नहीं है कि पहले इस समाधान के साथ किसने उत्तर दिया था। वैसे भी मैं यहां भी वोट देता हूं। एलन के अलावा 10k स्कोर अधिक है। – Agzam

10

निम्नलिखित कार्य करना चाहिए।

var myString = "$%^DDFG 6 7 23 1"; 

//note that this is still an IEnumerable object and will need 
// conversion to int, or whatever type you want. 
var myNumber = myString.Where(a=>char.IsNumber(a)).Take(3); 

यह अगर आप चाहते हैं 23 एक संख्या अनुक्रम पर विचार किया जाना स्पष्ट नहीं है, या 2 अलग संख्या। उपर्युक्त मेरा समाधान मानता है कि आप अंतिम परिणाम 672

+0

आपके जैसा ही समाधान आप को छोड़कर बहुत तेज़ हो गया था :) – Kelsey

+3

आप कहां लिख सकते हैं 'जहां (char.IsNumber)' मुझे लगता है क्योंकि यह एक char स्वीकार करता है और एक बूल देता है - लामा के लिए कोई ज़रूरत नहीं है। – Rup

+1

@Rup: कूल। कुछ नया सीख लिया। – Alan

1

इस तरह कुछ कैसे करें?

var yourstring = "$%^DDFG 6 7 23 1"; 
var selected = yourstring.ToCharArray().Where(c=> c >= '0' && c <= '9').Take(3); 
var reduced = yourstring.Where(char.IsDigit).Take(3); 
+0

जो कि पढ़ने के लिए मुश्किल है .. है ना? – Agzam

+0

मुझे लगता है कि यह हो सकता है यदि आप LINQ और lambda अभिव्यक्तियों को नहीं जानते हैं। –

2
string testString = "$%^DDFG 6 7 23 1"; 
string cleaned = new string(testString.ToCharArray() 
    .Where(c => char.IsNumber(c)).Take(3).ToArray()); 

.Take(3) का उपयोग आप सफेद सूची उपयोग करना चाहते हैं (हमेशा संख्या नहीं) :

char[] acceptedChars = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; 
string cleaned = new string(testString.ToCharArray() 
    .Where(c => acceptedChars.Contains(c)).Take(3).ToArray()); 
0

Regex:

private int ParseInput(string input) 
{ 
    System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex(@"\d+"); 
    string valueString = string.Empty; 
    foreach (System.Text.RegularExpressions.Match match in r.Matches(input)) 
     valueString += match.Value; 
    return Convert.ToInt32(valueString); 
} 

और यहां तक ​​कि मामूली कठिन: हम केवल पहले तीन नंबर मिल सकता है?

private static int ParseInput(string input, int take) 
    { 
     System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex(@"\d+"); 
     string valueString = string.Empty; 
     foreach (System.Text.RegularExpressions.Match match in r.Matches(input)) 
      valueString += match.Value; 
     valueString = valueString.Substring(0, Math.Min(valueString.Length, take)); 
     return Convert.ToInt32(valueString); 
    } 
3
public static string DigitsOnly(string strRawData) 
    { 
    return Regex.Replace(strRawData, "[^0-9]", ""); 
    } 
+0

कि एक भी अच्छा है – Agzam

0
> 'string strRawData="12#$%33fgrt$%$5"; 
> string[] arr=Regex.Split(strRawData,"[^0-9]"); int a1 = 0; 
> foreach (string value in arr) { Console.WriteLine("line no."+a1+" ="+value); a1++; }' 

Output:line no.0 =12 
line no.1 = 
line no.2 = 
line no.3 =33 
line no.4 = 
line no.5 = 
line no.6 = 
line no.7 = 
line no.8 = 
line no.9 = 
line no.10 =5 
Press any key to continue . . .