2010-08-13 15 views
9

È possibile scrivere una query in cui vengono ottenuti tutti i caratteri che possono essere analizzati in int da una stringa qualsiasi?Utilizzo di LINQ per analizzare i numeri da una stringa

Per esempio abbiamo una stringa come: "$%^DDFG 6 7 23 1"

risultato deve essere "67231"

e anche piccoli più difficile: Possiamo avere solo i primi tre numeri?

+2

l'esigenza esatta non è del tutto chiaro, che cosa accadrebbe con una stringa di like'123abc456def', vuoi tornare '123456',' 123' e '456', solo '123' o forse' 1' e '2' e' 3' etc? L'approccio migliore dipende dalle specifiche esatte. –

+2

@Paul dice i primi tre numeri. Come potrebbe essere più esatto? Forse ti piacerebbe che scrivessi 300 pagine di specifiche e una specie di business plan con un mucchio di diagrammi? :) – Agzam

risposta

20

Questo vi darà la stringa

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

E per i primi 3 caratteri usano .Take(3) prima ToArray()

+2

Non ricordo chi ha risposto prima con questa soluzione. Comunque voterò anche qui. Inoltre Alan ha più di 10.000 punti. – Agzam

10

Quanto segue dovrebbe funzionare.

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); 

Non è chiaro se si desidera 23 per essere considerato un unico numero di sequenza, o 2 numeri distinti. La mia soluzione sopra presuppone che tu voglia che il risultato finale sia 672

+0

soluzione simile alla mia tranne che tu fossi mooolto più veloce lol :) – Kelsey

+3

Puoi scrivere il dove come '.Where (char.IsNumber)' Penso che dal momento che accetta un carattere e restituisce un bool - non è necessario per la lamda. – Rup

+1

@Rup: Cool. Ho imparato qualcosa di nuovo. – Alan

1

Che ne dici di qualcosa del genere?

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

è difficile da leggere ... non è vero? – Agzam

+0

Suppongo che potrebbe essere se non si conoscono le espressioni LINQ e lambda. –

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

Se si desidera utilizzare una lista bianca (non sempre i numeri) :

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); 
} 

e anche piccoli più difficile: Possiamo ottenere solo i primi tre numeri?

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

anche quello bello – 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 . . . 
Problemi correlati