2

これが何と呼ばれるのかわからないので、例を挙げて説明します。私は数字の配列を持っています

76425
234786234
56
4356
564356
456
94
900
725

次に、このデータを結合して、次のような新しい配列を作成します。

76425,234786234,56,4356
564356,456,94,900
725

これは、3つの項目を含む文字列配列です。行ごとのアイテムは4です。ご覧のとおり、最後の行には1つのアイテムしかありません。それは大丈夫です。これを行うために私が書いたコードは次のとおりです。

 numberOfColumns = numberOfColumns > lineCount ? lineCount : numberOfColumns;
 int newLineCount = Convert.ToInt32(Math.Ceiling((Convert.ToDouble(lineCount))/numberOfColumns));
 StringBuilder sb = new StringBuilder();

 for (int i = 0; i < newLineCount; i++)
 {
      var page = lines.Skip(numberOfColumns * i).Take(numberOfColumns).Select(xx => xx.Trim());
      sb.AppendLine(string.Join(",",page));
 }

このコードは問題なく機能します。しかし、それは非常に遅いです。それをより速くするためのアイデアはありますか?

4

3 に答える 3

5

このようなものをお探しですか?

StringBuilder sb = new StringBuilder();
for (int i = 0; i < lines.Count; i++)
{
    sb.Append(lines[i]);
    if ((i % 4) == 3)
        sb.AppendLine();
    else
        sb.Append(',');
}
于 2012-11-11T23:41:33.593 に答える
0

使用する:

var arr = new[]
    {
        76425,
234786234,
56,
4356,
564356,
456,
94,
900,
725,
    };

var result =
    arr.Select((x, i) => new {x, i})
    .GroupBy(t => t.i / 4)
    .Select(t => string.Join(",", t.Select(v => v.x)));

出力:

76425,234786234,56,4356
564356,456,94,900
725
于 2012-11-11T23:54:48.863 に答える
0

反復回数を減らすと、パフォーマンスが向上します。

List<string> result = new List<string>();

for (int i = 0; i < lines.Count; i+=4)
{
 result.Add(string.Format ("{0},{1},{2},{3}", lines[i], lines[i+1], lines[i+2], lines[i+3]));
}

また、マルチコアプロセッサを使用している場合は、並列処理を使用できます。

 var linesPerProcessor = (int)(((lines.Count/4) / Environment.ProcessorCount)*4);
 Parallel.For(0,Environment.ProcessorCount -1
            ) =>
                {
                   for (int i = (p * linesPerProcessor); i < (p+1)*linesPerProcessor; i+=4)
                   {
                          result.Add(string.Format ("{0},{1},{2},{3}", 
                                lines[i], lines[i+1], lines[i+2], lines[i+3]));
                   }
                }
            );
于 2012-11-11T23:52:40.023 に答える