2010-02-15 5 views
4

Je souhaite diviser une chaîne en fonction d'un prédicat. A titre d'exemple:Division d'une chaîne, basée sur le prédicat

« ImageSizeTest » devrait devenir « Taille de l'image Test »

Note: Uppercased caractère est le prédicat

Bien sûr, je pourrais écrire une simple boucle, en passant par la chaîne, vérifiez en majuscule caractères (le prédicat) et construire la nouvelle chaîne. Cependant, je veux que ce soit un peu plus général, en se basant sur n'importe quel prédicat. Toujours pas très difficile à mettre en œuvre, mais je me demandais s'il existe une façon élégante de le faire en utilisant Linq.

Référence:

  1. Splitting a String with two criteria
+1

Il méritait beaucoup de upvotes. J'ai fait le mien :-) – Lijo

+0

pour ceux qui veulent une vraie extension string.split: http://stackoverflow.com/a/298990/893406 –

Répondre

3

Je suppose que vous ne voulez pas le diviser en un tableau, mais plutôt présenter des espaces à une chaîne? Si c'est le cas, vous pouvez utiliser une expression régulière pour remplacer chaque caractère majuscule par un caractère [espace]. Vous auriez besoin de couper l'espace principal cependant.

Désolé, pour répondre à la question complète, vous pouvez le rendre plus générique en passant dans l'expression régulière à correspondre et la chaîne pour remplacer les correspondances avec.

En regardant http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.matchevaluator.aspx, ne pourriez-vous pas considérer le MatchEvaluator comme votre prédicat?

+1

Je suppose que j'aurais dû m'expliquer un peu plus clairement: je voulez pouvoir utiliser n'importe quelle fonction de prédicat: 'bool MyPredicate (char c)' –

+2

Ajout de la partie à propos de MatchEvaluator. Cela couvre-t-il vos besoins pour le prédicat? –

+0

Le MatchEvaluator ressemble plus à l'action (par exemple insérer un espace) que je veux exécuter. Néanmoins +1 puisque c'est très utile. –

2
 string test ="ImageSizeTest"; 

     string pattern = "[A-Z]"; 
     Regex AllCaps = new Regex(pattern);      

     var fs = test.ToCharArray().Select(x => 
     { 
      if (AllCaps.IsMatch(x.ToString())) 
       return " " + x.ToString(); 

      return x.ToString(); 
     }).ToArray(); 

     var resss =string.Join("",fs).Trim();