2013-05-30 7 views
15

Was ist der beste Weg, um die einzelnen Zeichen in einem Array von Strings strArr in ein Array dieser Zeichen zu trennen charArr, wie unten dargestellt?Wie kann ich eine Reihe von Zeichenfolgen in ihre Bestandteile in C# teilen?

string[] strArr = { "123", "456", "789" }; 
char[] chrArr = { '1', '2', '3', '4', '5', '6', '7', '8', '9' }; 

Das ist, was ich derzeit tue, aber ich glaube nicht, dass es sehr elegant ist:

char[] chrArr = string.Join(string.Empty, strArr).ToCharArray(); 

:

int characterCount = 0; 

for (int i = 0; i < strArr.Length; i++) 
{ 
    characterCount += strArr[i].Length; 
} 

int indexCount = 0; 
char[] chrArr = new char[characterCount]; 

for (int i = 0; i < strArr.Length; i++) 
{ 
    for (int j = 0; j < strArr[i].Length; j++) 
    { 
     chrArr[indexCount] = strArr[i][j]; 
     indexCount++; 
    } 
} 

Antwort

42

Nun, einfachste Weg, dies wäre Um sicherzustellen, dass die Leistungsmerkmale nicht verfälscht sind, finden Sie hier ein kurzes Programm zum Testen unter LINQPad (Vergessen Sie nicht, Optimierungen zu aktivieren in der unteren rechten Ecke):

static string[] strArr = { "123", "456", "789" }; 

void Main() 
{ 
    const int iterations = 10000000; // 10 million 

    // Warm up JITter 
    StringJoin(); 
    LINQSelectMany(); 
    LINQ(); 

    Stopwatch sw = Stopwatch.StartNew(); 
    for (int index = 0; index < iterations; index++) 
     StringJoin(); 
    sw.Stop(); 
    sw.ElapsedMilliseconds.Dump("String.Join"); 

    sw.Restart(); 
    for (int index = 0; index < iterations; index++) 
     LINQSelectMany(); 
    sw.Stop(); 
    sw.ElapsedMilliseconds.Dump("LINQ SelectMany"); 

    sw.Restart(); 
    for (int index = 0; index < iterations; index++) 
     LINQ(); 
    sw.Stop(); 
    sw.ElapsedMilliseconds.Dump("LINQ"); 
} 

public static void StringJoin() 
{ 
    char[] c = string.Join(string.Empty, strArr).ToCharArray(); 
} 

public static void LINQSelectMany() 
{ 
    char[] c = strArr.SelectMany(s => s).ToArray(); 
} 

public static void LINQ() 
{ 
    var characters = (from s in strArr 
         from c in s 
         select c).ToArray(); 

} 

können Sie dieses LINQPad Skript herunterladen here wenn Sie mit ihm spielen wollen.

Ausgang (in Millisekunden):

String.Join 
765 

LINQ SelectMany 
5098 

LINQ 
5465 

(die übliche Einschränkung über Mess Code Leistung gilt auch hier, keine Fehler hinweisen ich gemacht)

+2

Das ist wirklich dumm zu sein scheint. LINQ scheint viel intuitiver und geeigneter ... –

+10

Bitte definieren Sie "geeignet". Ein einfacher Leistungstest zeigt, dass meine Linie die SelectMany-Linie um den Faktor 8 übersteigt. Da keiner der beiden spezifische Vorteile zu bieten scheint (wie Edgecases oder was auch immer besser), würde ich die schnellere nehmen, wenn ich kann. Persönlich habe ich nicht das Gefühl, dass sie in Bezug auf die Lesbarkeit so verschieden sind. –

+0

* geeignet * (adj.): Geeignet oder angemessen unter den gegebenen Umständen. :) - Ich habe nicht gesagt, dass du falsch liegst. Ich habe einfach gesagt, dass es "intuitiver" (oder C# idiomatisch) zu sein scheint, LINQ zu verwenden. Fühlen Sie sich frei zu widersprechen. –

7
var res = strArr.SelectMany(c => c.ToCharArray()).ToArray(); 
+2

Das ist mein Favorit. –

+0

@EdPlunkett Kann ich fragen, warum "ToCharArray" unnötig ist? – I4V

+0

@ I4V Guter Punkt. Du hast Recht, und das habe ich vermisst. Ich mochte es wegen SelectMany() und bevorzugte es gegenüber dem anderen SelectMany() wegen "var" anstelle von char []. –

19

ich tun würde:

char[] chrArr = strArr.SelectMany(s => s).ToArray(); 
+4

Ich kann diese Antwort nicht glauben bekommt 2 upvotes und die alberne 14. – I4V

+2

@ I4V Wie ist es albern? Ich finde es ** extrem ** schlau. –

+2

@newStackExchangeInstance Weiter zu tun ... – I4V

3

LINQ basierte Version wäre:

var input = new string[] { "abc", "def", "ghi" }; 
var characters = (from s in input 
        from c in s 
        select c).ToArray(); 

foreach (var c in characters) Console.WriteLine(c); 
1

Dies ist im Grunde eine Erweiterung der Antwort von Jesse Slicer.

einfach Ihren Code mit ReSharper Reinigung (wenn Sie nicht, wie es dies oder etwas haben, gehen sie jetzt bekommen) ergibt dies:

var characterCount = strArr.Sum(t => t.Length); 

var indexCount = 0; 
var chrArr = new char[characterCount]; 

foreach (var t1 in strArr.SelectMany(t => t)) 
{ 
    chrArr[indexCount] = t1; 
    indexCount++; 
} 

Die foreach nur ein Array füllen und es gibt bereits eine LINQ-Methode ToArray dafür. Dann sind characterCount und indexCount völlig unnötig.

var chrArr = strArr.SelectMany(t => t).ToArray(); 
0

versuchen, dies ..

string value=""; 
string[] strArr = { "123", "456", "789" }; //Your string array. 

for(int i=0;i<strArr.Length;i++) 
{ 
    value+=strArr[i]; 
} 
    char [] array=value.ToCharArray(); 
Verwandte Themen