分割数据的最快方法是什么

时间:2012-11-11 23:36:58

标签: c#

我不确定这是什么叫,所以我举一个例子来解释。我有一组数字

76425
234786234
56
4356
564356
456
94
900
725

现在我想加入这些数据并创建一个看起来像这样的新数组

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

这是一个包含3个项目的字符串数组。每行的项目是4.如您所见,最后一行只有一个项目。那没问题。这是我写的代码:

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

这段代码很好用。但它很慢。你有什么想法让它更快。

3 个答案:

答案 0 :(得分: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(',');
}

答案 1 :(得分: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]));
                   }
                }
            );

答案 2 :(得分: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