我不确定这是什么叫,所以我举一个例子来解释。我有一组数字
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));
}
这段代码很好用。但它很慢。你有什么想法让它更快。
答案 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