2009-11-05 14 views

risposta

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

Ho appena realizzato si desidera una string [] e non una stringa:

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

Nasty. Ma funziona ...

+1

Questo non produce una stringa [] come richiesto da Edward. –

1

Basta selezionare una stringa invece di un carattere per ogni non lettera.

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

Nota che devi solo farlo nella chiamata a String.Join - con questo codice, la chiamata Count() finirà per convertire ogni carattere in una stringa inutilmente. (In alternativa puoi chiamare ToList per calcolare i risultati una volta sola.) –

+0

Hai ragione, non hai pensato alla chiamata .Count(). La soluzione ottimale sarebbe aggiungere il .ToArray() prima di Console.WriteLine quindi ;-) –

3

Penso che si desidera:

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()) 
    ); 

Tutto quello che ho fatto è chiamare Select(x => x.ToString()) sul nonLetters nella chiamata String.Join. Sembra funzionare.

5

Se in realtà non interessa usare String.Join, ma vuole solo il risultato, utilizzando nuova stringa (char []) è il cambiamento più semplice:

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())); 

ma per il vostro esempio è più efficiente se lo si fa in questo modo:

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); 

il motivo di questo è più efficiente è che l'altro esempio itera il tuo dove iteratore due volte: una volta per la chiamata Count() e l'altra volta f o la chiamata ToArray().

0

Con .NET 4 you have another overload per Join. Per quanto semplice:

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

consente di risparmiare un'altra parte Select e ToArray. Quindi dovrebbe essere leggermente più efficiente .. Il ToString è chiamato internamente.

Problemi correlati