2009-11-05 3 views
7

Comment puis-je convertir le IEnumerable<char> "nonLetters" en un string[] afin que je puisse l'utiliser avec String.Join?Comment convertir IEnumerable <char> en string [] afin que je puisse l'utiliser avec String.Join?

string message = "This is a test message."; 

var nonLetters = message.Where(x => !Char.IsLetter(x)); 

Console.WriteLine("There are {0} non-characters in \"{1}\" and they are: {2}", 
    nonLetters.Count(), 
    message, 
    String.Join(", ", nonLetters.ToArray()) 
    ); 

Répondre

12
string[] foo = nonLetters.Select(c => c.ToString()).ToArray(); 
2
string result = new string(nonLetters.ToArray()); //convert to a string 

Je viens de réaliser que vous voulez une chaîne [] et non une chaîne:

string[] result = nonLetters.Select(c => new string(new[] { c })).ToArray(); 

Nasty. Mais cela fonctionne ...

+1

Cela ne produit pas une chaîne [] comme demandé Edward. –

1

Sélectionnez simplement une chaîne au lieu d'un caractère pour chacune de vos lettres.

String() nonLetters = message.Where(x => !Char.IsLetter(x)) 
          .Select(x => x.ToString()) 
          .ToArray(); 
+0

Notez que vous n'avez besoin de le faire que dans l'appel de String.Join - avec ce code, l'appel Count() finira par convertir chaque caractère en une chaîne inutile. (Vous pouvez également appeler ToList pour calculer uniquement les résultats une fois.) –

+0

Vous avez raison, vous n'avez pas pensé à l'appel .Count(). La solution la plus optimale serait d'ajouter le .ToArray() avant la Console.WriteLine puis ;-) –

3

Je pense que vous voulez:

string message = "This is a test message."; 

var nonLetters = message.Where(x => !Char.IsLetter(x)); 

Console.WriteLine("There are {0} non-characters in \"{1}\" and they are: {2}", 
    nonLetters.Count(), 
    message, 
    String.Join(", ", nonLetters.Select(x => x.ToString()).ToArray()) 
    ); 

Tout ce que je l'ai fait est appel Select(x => x.ToString()) sur nonLetters dans l'appel String.Join. Ça semble fonctionner.

5

Si vous ne se soucient pas vraiment sur l'utilisation String.Join mais seulement voulez que le résultat, en utilisant nouvelle chaîne (char []) est le changement le plus simple:

string message = "This is a test message."; 
var nonLetters = message.Where(x => !Char.IsLetter(x)); 
Console.WriteLine("There are {0} non-characters in \"{1}\" and they are: {2}", 
    nonLetters.Count(), 
    message, 
    new string(nonLetters.ToArray())); 

mais pour votre exemple, il est plus efficace si vous le faites de cette façon:

string message = "This is a test message."; 
string nonLetters = new string(message.Where(x => !Char.IsLetter(x)).ToArray()); 
Console.WriteLine("There are {0} non-characters in \"{1}\" and they are: {2}", 
    nonLetters.Length, 
    message, 
    nonLetters); 

la raison pour laquelle cela est plus efficace que l'autre exemple itère votre où deux iterator: Une fois l'appel Count() et l'autre temps f ou l'appel ToArray().

0

Avec .NET 4 you have another overload pour joindre. Aussi simple que:

var nonLettersJoined = string.Join(", ", message.Where(x => char.IsLetter(x))); 

vous épargnerez une autre partie Select et ToArray. Donc, devrait être légèrement plus efficace .. Le ToString est appelé en interne.

Questions connexes