2011-01-17 8 views
5

Quiero una forma más corta de obtener el primer carácter de cada palabra en una cadena en C#.forma más corta de obtener el primer carácter de cada palabra en una cadena

lo que he hecho es:

string str = "This is my style"; 
string [] output = str.Split(' '); 
foreach(string s in output) 
{ 
    Console.Write(s[0]+" "); 
} 

// Output 
T i m s 

Quiero mostrar misma salida con un camino más corto ...

Gracias

+3

Bueno, eso es más o menos el camino más corto. – KaiserJohaan

+0

En realidad, no veo nada malo con este método. Es legible y hace lo que dice en la caja. ¿Por qué quieres más corto? El hecho de que algo sea más corto no significa que sea legible u obvio para lo que está haciendo. Lo que tienes aquí ni siquiera necesita comentarios. –

Respuesta

7
string str = "This is my style"; 
str.Split(' ').ToList().ForEach(i => Console.Write(i[0] + " ")); 
+1

Usando 'Array.ForEach (str.Split (''), s => Console.Write (s [0] +" "));' sería un poco más corto y más rápido. También es posible que desee utilizar 'StringSplitOptions.RemoveEmptyEntries' para manejar la situación en la que la cadena comienza con un espacio o contiene espacios consecutivos. – LukeH

13
var firstChars = str.Split(' ').Select(s => s[0]); 

Si el rendimiento es crítico:

var firstChars = str.Where((ch, index) => ch != ' ' 
         && (index == 0 || str[index - 1] == ' ')); 

La segunda solución es menos legible, pero encierra la cadena una vez.

+2

Use '.Split (" ", StringSplitOptions.RemoveEmptyEntries)' en su lugar para evitar errores en varios espacios. –

1

creo que la solución es perfectamente bien, pero si quieres un mejor rendimiento que puede probar:

string str = "This is my style"; 
Console.Write(str[0]); 
for(int i = 1; i < str.Length; i++) 
{ 
    if(str[i-1] = " ") 
     Console.Write(" " + str[i]); 
} 

Usted puede obtener un factor constante inferior con este código, pero todavía se ejecuta en O (n). Además, supongo que nunca habrá más de un espacio en una fila y no comenzará con espacio.

Si desea escribir menos código que puede probar:

str result = str.Split(" ").Select(y => y[0]).ToList(); 

o algo así.

+0

Tendrá un problema si la cadena comienza con ''. –

+0

Sí ... Agregué una nota de reserva para eso. –

0

Las expresiones regulares podrían ser la respuesta:

Regex.Matches(text, @"\b(\w{1})") 
    .OfType<Match>() 
    .Select(m => m.Groups[1].Value) 
    .ToArray(); 
Cuestiones relacionadas