2010-12-06 33 views
9

Estoy teniendo una cadena comoCómo quitar caracteres de una cadena utilizando LINQ

XQ74MNT8244A

i nee para eliminar todo el char de la cadena.

lo que la salida será como

748244

Cómo hacer esto? me puede ayudar a hacer esto

+0

No necesita un 'regex' - vea la respuesta de @Tim Robinson. – ChrisF

+0

¿No quieres respuestas LINQ? ¿Puedes reescribir tu pregunta o cerrarla y publicar una nueva? –

+1

Su pregunta pregunta por LINQ, pero su comentario pregunta por regex. ¿Qué es lo que realmente quieres? En este caso, creo que LINQ es la mejor solución ya que la solución de Tim Robinson es mucho más legible que cualquier solución basada en 'RegEx'. –

Respuesta

23
new string("XQ74MNT8244A".Where(char.IsDigit).ToArray()) == "748244" 
+2

+1. Muy elegante. Una pregunta aquí. ¿Cómo funciona 'Where (char.IsDigit)' en este caso? Creo que tienes que escribir '¿Dónde (c => char.IsDigit (c))' aquí? ¿El compilador hace algo de magia en este caso? Una explicación sería apreciada aquí. –

+5

@ Øyvind - sin magia. 'Char.IsDigit' es una función que toma' char' y devuelve 'bool' - exactamente lo que' Where' espera. No tiene que envolverlo en una función anónima.(Ah, y el compilador hace mucha magia de todos modos, como funciones anónimas) – Kobi

+0

@ Øyvind Puede proporcionar cualquier delegado al método 'Dónde'; La sintaxis lambda es solo una forma de obtener un delegado. Si su lambda realiza una llamada directa a algún método, y los tipos de parámetros y el tipo de retorno del método coinciden con los de la lambda, puede proporcionar el nombre del método directamente. –

2

¿Qué tal un método de extensión (y sobrecarga) que hace esto para usted:

public static string NumbersOnly(this string Instring) 
    { 
     return Instring.NumbersOnly(""); 
    } 

    public static string NumbersOnly(this string Instring, string AlsoAllowed) 
    { 
     char[] aChar = Instring.ToCharArray(); 
     int intCount = 0; 
     string strTemp = ""; 

     for (intCount = 0; intCount <= Instring.Length - 1; intCount++) 
     { 
      if (char.IsNumber(aChar[intCount]) || AlsoAllowed.IndexOf(aChar[intCount]) > -1) 
      { 
       strTemp = strTemp + aChar[intCount]; 
      } 
     } 

     return strTemp; 
    } 

La sobrecarga es para que pueda mantener "-", "$" o". " también, si lo desea (en lugar de estrictamente números).

Uso:

string numsOnly = "XQ74MNT8244A".NumbersOnly(); 
6
string value = "HTQ7899HBVxzzxx"; 
Console.WriteLine(new string(
    value.Where(x => (x >= '0' && x <= '9')) 
    .ToArray())); 
2

Si necesita sólo dígitos y que realmente quiere LINQ intente esto:

youstring.ToCharArray().Where(x => char.IsDigit(x)).ToArray(); 
+0

ToCharArray() es inútil aquí ya que implementa IEnumerable – PierrOz

+0

@PierrOz - Eso es absolutamente cierto. Sin embargo, Visual Studio 2008 Intellisense oculta los métodos de extensión 'IEnumerable ', por lo que es fácil pasar por alto. – Kobi

2

mediante LINQ:

public string FilterString(string input) 
{ 
    return new string(input.Where(char.IsNumber).ToArray()); 
} 
2

Algo como esto?


"XQ74MNT8244A".ToCharArray().Where(x => { var i = 0; return Int32.TryParse(x.ToString(), out i); }) 
2
string s = "XQ74MNT8244A"; 
var x = new string(s.Where(c => (c >= '0' && c <= '9')).ToArray()); 
11

dos opciones. El uso de LINQ en .Net 4 (de 3,5 que es similar - que no tiene que muchas sobrecargas de todos los métodos):

string s1 = String.Concat(str.Where(Char.IsDigit)); 

O, utilizando una expresión regular:

string s2 = Regex.Replace(str, @"\D+", ""); 

debo añadir que IsDigit y \D son compatibles con Unicode, por lo que acepta bastantes dígitos además de 0-9, por ejemplo "542abc٣٤".
Puede adaptarlos fácilmente a un cheque entre 0 y 9, o al [^0-9]+.

+0

Se puede hacer mucho con LINQ, pero eso no significa que se deba usar para todo. +1 para sugerir la opción RegEx. –

+2

El uso de string.concat aquí es más agradable que el .ToArray() que estaba pensando en usar. –

+0

@Unmesh Estoy de acuerdo en que es fácil ver a Linq como un martillo de oro, y he sido culpable de eso en algunas ocasiones. En este caso, creo que la solución Linq es mucho más agradable de leer que la Regex. (posiblemente mucho más rápido también) –

Cuestiones relacionadas