15

以下に示すように、文字列の配列内の個々の文字strArrをそれらの文字の配列に分離する最良の方法は何charArrですか?

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

6 に答える 6

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 スクリプトをここからダウンロードできます。

出力 (ミリ秒単位):

String.Join 
765 

LINQ SelectMany 
5098 

LINQ 
5465 

(パフォーマンス測定コードに関する通常の警告がここに適用されます。間違いがあれば指摘してください)

于 2013-05-30T20:06:31.007 に答える
19

私はするだろう:

char[] chrArr = strArr.SelectMany(s => s).ToArray();
于 2013-05-30T20:07:38.683 に答える
7
var res = strArr.SelectMany(c => c.ToCharArray()).ToArray();
于 2013-05-30T20:07:25.223 に答える
1

これは基本的に Jesse Slicer の回答の拡張です。

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();
于 2013-05-30T20:29:12.500 に答える
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();
于 2013-05-31T07:24:55.747 に答える