【发布时间】:2012-02-17 12:18:38
【问题描述】:
我正在寻找一种将大型 int[] 转换为 csv 字符串的 string[] 的有效方法,其中每个 csv 限制为最多 4000 个字符。数组中的值可以是 1 到 int.MaxValue 之间的任何值。
这是我的最终代码:
public static string[] GetCSVsFromArray(int[] array, int csvLimit)
{
List<string> parts = new List<string>();
StringBuilder sb = new StringBuilder();
foreach(int id in array)
{
string intId = id.ToString();
if (sb.Length + intId.Length < csvLimit)
sb.Append(intId).Append(",");
else
{
if (sb.Length > 0)
sb.Length--;
parts.Add(sb.ToString());
sb.Length = 0;
}
}
if(sb.Length>0)
parts.Add(sb.ToString());
return parts.ToArray();
}
有没有更有效的方法来做到这一点?
这就是我现在使用的(我能够将返回参数更改为 List 类型以在最后保存 ToArray() 调用):
public static List<string> GetCSVsFromArray(int[] array, int csvLimit)
{
List<string> parts = new List<string>();
StringBuilder sb = new StringBuilder();
foreach(int id in array)
{
string intId = id.ToString();
if (sb.Length + intId.Length < csvLimit)
sb.Append(intId).Append(",");
else
{
if (sb.Length > 0)
sb.Length--;
parts.Add(sb.ToString());
sb.Length = 0;
}
}
if(sb.Length>0)
parts.Add(sb.ToString());
return parts;
}
性能结果:
10,000,000 个项目 csv 限制为 4000 个字符
- 原文:2,887.488ms
- GetIntegerDigitCount: 3105.355ms
- 最终:2883.587ms
虽然在我的开发人员机器上删除 ToArray() 调用只节省了 4 毫秒,但这似乎在速度慢得多的机器上产生了显着差异(在 DELL D620 上节省了 200 多毫秒)
【问题讨论】:
-
你在做多余的
parts.ToArray(),它为引擎盖下的所有项目做内存复制 -
你在新建一行的时候把intId的值扔掉了?
-
为什么我觉得你是rolling your own CSV parser?请不要那样做。不要写这样的代码。
-
csv 是我无法更改的存储过程的输入参数 (nvarchar(4000))。
标签: c# .net-3.5 refactoring