2011-01-17 8 views
5

Ich möchte einen kürzesten Weg, um den ersten Buchstaben jedes Wortes in einer Zeichenfolge in C# zu erhalten.kürzester Weg, um das erste Zeichen von jedem Wort in einer Zeichenfolge zu erhalten

, was ich getan habe, ist:

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

// Output 
T i m s 

I gleiche Leistung mit einem kürzesten Weg angezeigt werden soll ...

Dank

+3

Nun, das ist so ziemlich der kürzeste Weg. – KaiserJohaan

+0

Ich sehe eigentlich nichts falsch mit dieser Methode. Es ist lesbar und macht das, was auf der Verpackung steht. Warum willst du kürzer? Nur weil etwas kürzer ist, heißt das nicht, dass es für das, was Sie tun, lesbar oder offensichtlich ist. Was Sie hier haben, braucht nicht einmal kommentiert zu werden. –

Antwort

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

Mit 'Array.ForEach (str.Split (' '), s => Console.Write (s [0] + "")); 'wäre etwas kürzer und schneller. Sie können auch 'StringSplitOptions.RemoveEmptyEntries' verwenden, um die Situation zu behandeln, in der die Zeichenfolge mit einem Leerzeichen beginnt oder aufeinanderfolgende Leerzeichen enthält. – LukeH

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

Wenn die Leistung entscheidend ist:

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

Die zweite Lösung ist weniger lesbar, aber die Zeichenfolge wird einmal durchlaufen.

+2

Verwenden Sie '.Split (" ", StringSplitOptions.RemoveEmptyEntries)' stattdessen, um Fehler in mehreren Leerzeichen zu vermeiden. –

1

Ich denke, Ihre Lösung ist völlig in Ordnung, aber wenn Sie eine bessere Leistung möchten, können Sie versuchen:

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

Sie könnten einen niedrigeren konstanten Faktor mit diesem Code erhalten, aber es läuft immer noch in O (n). Außerdem gehe ich davon aus, dass es nie mehr als ein Leerzeichen in Folge geben wird und es nicht mit Leerzeichen beginnen wird.

Wenn Sie wollen weniger Code schreiben, können Sie versuchen:

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

Oder etwas.

+0

Sie werden ein Problem haben, wenn die Zeichenfolge mit '' beginnt. –

+0

Ja ... Ich habe einen Reservierungsvermerk dafür hinzugefügt. –

0

Reguläre Ausdrücke könnte die Antwort sein:

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