2010-07-30 3 views
3

Je suis en train d'écrire une fonction qui en entrée prend une chaîne contenant des mots et supprime tous les mots de caractère unique et retourne la nouvelle chaîne sans les caractères supprimésNettoyage Chaîne en C#

Par exemple:

string news = FunctionName("This is a test"); 
//'news' here should be "This is test". 

Peux-tu aider s'il te plait?

+3

Si vous faites beaucoup de traitement de chaîne, éviter Regex. C'est des balles lentes. Je choisirais la solution non-Regex comme la meilleure réponse. –

+0

Et vous pourriez l'implémenter comme une méthode de chaîne d'extension pour le rendre plus facile à lire. – Peter

Répondre

3

Je suis sûr qu'il ya une plus belle réponse à l'aide regex, mais vous pouvez faire ce qui suit:

string[] words = news.Split(' '); 

StringBuilder builder = new StringBuilder(); 
foreach (string word in words) 
{ 
    if (word.Length > 1) 
    { 
     if (builder.ToString().Length ==0) 
     { 
      builder.Append(word); 
     } 
     else 
     { 
      builder.Append(" " + word); 
     } 
    } 
} 

string result = builder.ToString(); 
2

La chose intéressante à propos de cette question est que probablement vous voulez aussi supprimer un des espaces environnants le mot à une lettre.

string[] oldText = {"This is a test", "a test", "test a"}; 
    foreach (string s in oldText) { 

     string newText = Regex.Replace(s, @"\s\w\b|\b\w\s", string.Empty); 
     WL("'" + s + "' --> '" + newText + "'"); 
    } 

sortie ...

'This is a test' --> 'This is test' 
'a test' --> 'test' 
'test a' --> 'test' 
+0

Je venais de frapper ce point. Puis j'ai commencé à considérer les chaînes commençant et se terminant par un seul caractère et ma tête commençait à me faire mal :) – MPritchard

+0

Au moins, déplacez instanciez l'expression rationnelle hors de la boucle pour augmenter la performance (tm);) –

+0

Codé pour plus de clarté avec les optimisations laissées en exercice pour le lecteur ;-) –

0

Avec la syntaxe LINQ, vous pouvez faire quelque chose comme

return string.Join(' ', from string word in input.Split(' ') where word.Length > 1)) 
6

obligatoire LINQ one-liner:

string.Join(" ", "This is a test".Split(' ').Where(x => x.Length != 1).ToArray()) 

Ou comme meilleure méthode d'extension:

void Main() 
{ 
    var output = "This is a test".WithoutSingleCharacterWords(); 
} 

public static class StringExtensions 
{ 
    public static string WithoutSingleCharacterWords(this string input) 
    { 
     var longerWords = input.Split(' ').Where(x => x.Length != 1).ToArray(); 
     return string.Join(" ", longerWords); 
    } 
} 
+0

+1 comme l'utilisation de la méthode d'extension et combien il est plus propre que mon exemple. Je dois apprendre LINQ correctement. – GenericTypeTea

+0

Et s'il y a différents espaces entre les mots? – Grzenio

+0

@Grzenio Vous pouvez utiliser Regex.Split (input, @ "\ s") à la place si vous voulez aussi attraper des tabulations et des sauts de ligne. Je passais juste le cas de test de la question :) –

0
string str = "This is a test."; 
var result = str.Split(' ').Where(s => s.Length > 1).Aggregate((s, next) => s + " " + next); 

UPD

Utilisation de la méthode d'extension:

public static string RemoveSingleChars(this string str) 
{ 
     return str.Split(' ').Where(s => s.Length > 1).Aggregate((s, next) => s + " " + next);  
} 


//----------Usage----------// 


var str = "This is a test."; 
var result = str.RemoveSingleChars();