2010-08-13 21 views
9

¿Es posible escribir una consulta donde tenemos todos esos personajes que se pudo analizar en int de cualquier cadena dada?mediante LINQ para analizar los números de una cadena de

Por ejemplo, tenemos una cadena como: "$%^DDFG 6 7 23 1"

El resultado debe ser "67231"

Y más difícil aún leves: ¿Podemos obtener sólo tres primeros números?

+2

El requisito exacto no está del todo claro, lo que sucedería con una cadena de like'123abc456def', qué quiere volver '123456',' '123' y 456', simplemente '123' o quizás' 1' y '2' y' 3', etc. El mejor enfoque depende de la especificación exacta. –

+2

@Paul dice los primeros tres números. ¿Cómo eso posiblemente podría ser más exacto? ¿Tal vez te gustaría escribir 300 páginas de especificaciones y algún tipo de plan de negocios con muchos diagramas? :) – Agzam

Respuesta

20

Esto le dará a su cadena de

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

Y para los 3 primeros caracteres utilizan .Take(3) antes ToArray()

+2

No recuerdo quién respondió primero con esta solución. De todos modos yo voto aquí también. Además, Alan tiene más de 10k de puntuación. – Agzam

10

El siguiente debería funcionar.

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

No está claro si quieres 23 para ser considerado una única secuencia de números, o 2 números distintos. Mi solución anterior se supone que desea que el resultado final sea 672

+0

solución similar a la mía, salvo que fuera más rápido MUUCHO lol :) – Kelsey

+3

Puede escribir el 'donde como .Where (char.IsNumber)' Creo que ya que acepta un char y devuelve un bool - sin necesidad de que el lambda. – Rup

+1

@Rup: Cool. Aprendí algo nuevo. – Alan

1

¿Qué tal algo como esto?

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

que es difícil de leer ... ¿no es así? – Agzam

+0

Supongo que podría ser si no conoce las expresiones LINQ y lambda. –

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

Si desea utilizar una lista blanca (no siempre los números) :

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

Y más difícil aún leves: ¿Podemos obtener sólo los primeros tres números?

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

ese agradable también – 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 . . . 
Cuestiones relacionadas