2013-05-30 32 views
15

將字符串數組strArr中的單個字符分隔成這些字符數組charArr的最佳方法是什麼?如何將一組字符串劃分爲C#中的組成字符?

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

這是我目前在做什麼,但我不認爲這是非常優雅:

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++; 
    } 
} 

回答

42

好,最簡單的方法是這樣的:

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

爲了確保在這裏沒有性能特徵的混淆,這裏有一個簡短的程序來測試LINQPad(不要忘記打開優化在右下角):

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

} 

,如果你想用它玩你可以下載這個LINQPad腳本here

輸出(以毫秒爲單位):

String.Join 
765 

LINQ SelectMany 
5098 

LINQ 
5465 

(約性能測量的代碼通常的警告適用於這裏,指出我犯任何錯誤)

+2

這看起來真的很傻。 LINQ似乎更直觀,更合適... –

+10

請定義「適當」。一個簡單的性能測試表明,我的產品線比SelectMany產品線多出8倍。因爲它們似乎都沒有比其他產品具有任何特殊優勢(比如處理邊緣案例或者更好的產品),所以我會盡可能採用更快的產品。就我個人而言,我不覺得它們在可讀性方面差別很大。 –

+0

*適當的*(adj。):適合或適當的情況。 :) - 我並不是說你錯了,我只是簡單地說它「似乎」更直觀(或C#慣用)來使用LINQ。請儘管不同意。 –

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

這是我的最愛。 –

+0

@EdPlunkett我可以問爲什麼'ToCharArray'是不必要的嗎? – I4V

+0

@ I4V好點。你是對的,我錯過了。我喜歡它,因爲SelectMany(),並且因爲「var」而不是char [],所以首選它到另一個SelectMany()。 –

19

我會做:

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

我不能相信這個答案得到2 upvotes和愚蠢的一個14. – I4V

+2

@ I4V它是如何愚蠢?我覺得它**非常聰明。 –

+2

@newStackExchangeInstance繼續做... – I4V

3

基於LINQ的版本將爲:

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

這基本上是傑西切片機的答案的延伸。

簡單的清理你的代碼ReSharper的(如果你沒有這樣或類似的東西呢,去得到它現在)產生這樣的:

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++; 
} 

foreach只是填充一個數組,不過已經有了LINQ方法ToArray。然後characterCountindexCount是完全不必要的。

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

試試這個..

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(); 
相關問題