2010-12-06 28 views
9

Je vais avoir une chaîne commeComment supprimer les caractères d'une chaîne à l'aide de LINQ

XQ74MNT8244A

i nee pour supprimer tous les char de la chaîne.

de sorte que la sortie sera comme

748244

Comment faire? S'il vous plaît aidez-moi à faire ce

+0

Vous n'avez pas besoin de 'regex' - voir la réponse de @Tim Robinson. – ChrisF

+0

Vous ne voulez pas de réponses LINQ? Pouvez-vous réécrire votre question, ou la fermer et en poster une nouvelle? –

+1

Votre question demande LINQ, mais votre commentaire demande regex. Que veux-tu réellement? Dans ce cas, je pense que LINQ est la meilleure solution car la solution de Tim Robinson est de loin plus lisible que n'importe quelle solution basée sur RegEx. –

Répondre

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

+1. Très élégant. Une question ici. Comment 'Where (char.IsDigit)' fonctionne-t-il dans ce cas? Je pense que vous devez écrire 'Où (c => char.IsDigit (c))' ici? Est-ce que le compilateur fait un peu de magie dans ce cas? Une explication serait appréciée ici. –

+5

@ Øyvind - pas de magie. 'Char.IsDigit' est une fonction qui prend un' char' et retourne un 'bool' - exactement ce que' ''' attend. Vous n'avez pas à l'envelopper dans une fonction anonyme.(oh, et le compilateur fait quand même beaucoup de magie, comme des fonctions anonymes) – Kobi

+0

@ Øyvind Vous pouvez fournir n'importe quel délégué à la méthode 'Where'; La syntaxe lambda est seulement un moyen d'obtenir un délégué. Si votre lambda appelle directement une méthode, et que les types de paramètres et le type de retour de la méthode correspondent à ceux du lambda, vous pouvez fournir directement le nom de la méthode. –

2

Que diriez-vous d'une méthode d'extension (et surcharge) qui fait cela pour vous:

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 surcharge est si vous pouvez conserver « - », « $ » ou ». " aussi, si vous le souhaitez (au lieu de strictement les chiffres).

Utilisation:

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

Si vous avez besoin que des chiffres et que vous voulez vraiment Linq, essayez ceci:

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

ToCharArray() est inutile ici car il implémente IEnumerable – PierrOz

+0

@PierrOz - C'est absolument vrai. Toutefois, Visual Studio 2008 Intellisense masque les méthodes d'extension 'IEnumerable ', il est donc facile à manquer. – Kobi

2

LINQ:

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

Quelque chose comme ça?


"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

Deux options. LINQ sur .Net 4 (sur 3,5 il est similaire - il n'a pas que beaucoup de toutes les méthodes de surcharges):

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

Ou, en utilisant une expression régulière:

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

Je dois ajouter que IsDigit et \D sont compatibles avec Unicode, donc il accepte pas mal de chiffres en plus de 0-9, par exemple "542abc٣٤".
Vous pouvez facilement les adapter à une vérification entre 0 et 9 ou [^0-9]+.

+0

On peut faire beaucoup en utilisant LINQ mais cela ne veut pas dire qu'il devrait être utilisé pour tout. +1 pour suggérer l'option RegEx. –

+2

L'utilisation de string.concat ici est plus agréable que le .ToArray() que je pensais utiliser. –

+0

@Unmesh Je suis d'accord qu'il est facile de voir Linq comme un marteau d'or, j'ai été coupable de moi-même à certaines occasions. Dans ce cas, je pense que la solution Linq est beaucoup plus agréable à lire que le Regex. (peut-être beaucoup plus rapide aussi) –