我已将Datatable
转换为json
字符串,请使用以下方法...
public string GetJSONString(DataTable Dt)
{
string[] StrDc = new string[Dt.Columns.Count];
string HeadStr = string.Empty;
for (int i = 0; i < Dt.Columns.Count; i++)
{
StrDc[i] = Dt.Columns[i].Caption;
HeadStr += "\"" + StrDc[i] + "\" : \"" + StrDc[i] + i.ToString() + "¾" + "\",";
}
HeadStr = HeadStr.Substring(0, HeadStr.Length - 1);
StringBuilder Sb = new StringBuilder();
Sb.Append("{\"" + Dt.TableName + "\" : [");
for (int i = 0; i < Dt.Rows.Count; i++)
{
string TempStr = HeadStr;
Sb.Append("{");
for (int j = 0; j < Dt.Columns.Count; j++)
{
if (Dt.Rows[i][j].ToString().Contains("'") == true)
{
Dt.Rows[i][j] = Dt.Rows[i][j].ToString().Replace("'", "");
}
TempStr = TempStr.Replace(Dt.Columns[j] + j.ToString() + "¾", Dt.Rows[i][j].ToString());
}
Sb.Append(TempStr + "},");
}
Sb = new StringBuilder(Sb.ToString().Substring(0, Sb.ToString().Length - 1));
Sb.Append("]}");
return Sb.ToString();
}
这是否足够公平,或者仍然存在优化余地,以使其执行得更快......任何建议......
答案 0 :(得分:4)
可能有办法让它更快地执行 - 但你有没有迹象表明你需要它执行得更快?你有充分的理由相信这是你代码中的一个重要瓶颈吗?如果是这样,请使用一些实际数据对代码进行基准测试,并对例程进行分析,以确定时间的进展。
答案 1 :(得分:4)
在询问您是否可以优化它以使其更快地执行之前,您需要问自己的第一个问题是,它对我来说运行得足够快吗?过早的优化是我们所有人的诅咒(我知道我已经完成了!)。你可能花费数小时试图对这段代码进行微优化,这可能会使它从例如20ms执行到15ms。是的,这将减少25%,但5ms真的值2小时的时间吗?更重要的是,它能为您的最终用户提供足够的好处吗?
您是否考虑过使用JsonSerializer from "Newtonsoft"?这可能是“足够快”,使用得相当广泛,因此整体上比我或你可以第一次写的任何东西都更正确。
纯粹从可读性的角度来看(也可能允许C#编译器/ CLR为你改进)你可以考虑改变字符串连接的长位,例如:
HeadStr += "\"" + StrDc[i] + "\" : \"" + StrDc[i] + i.ToString() + "¾" + "\",";
要:
HeadStr += string.Format("\"{0}\" : \"{0}{1}¾\",", strDc[i], i);
但是对于你所做的任何改变。测量,冲洗,重复=)
答案 2 :(得分:1)
你可以收拾一些东西:
string.Format()
来避免长x + y + z
个序列。这可能会或可能不会使事情变得更快(无论哪种方式都是边缘的)。.toString()
。您还可以传入要填充的StringBuffer
,以便调用者可以将多个此类操作捆绑到一个StringBuffer
中。
这些建议更侧重于整洁而不是性能,我认为这应该是真正的焦点,除非此代码在您的分析中被视为瓶颈。
答案 3 :(得分:0)
为什么你认为它需要优化?某些DataTables真的很慢吗? 我只是用Newton JSON序列化器来序列化DataTable,如果它可以序列化的话。
答案 4 :(得分:0)
重构您的代码,使用像ReSharper,JustCode等工具来整理它。提取方法并使用单独的测试(Test Driven Development-ish)来查找代码中的瓶颈,然后进行调整。
但你的第一步应该是:重构!
答案 5 :(得分:0)
代码的问题不是速度,而是它没有清理。我做了一些清理,但你可能会做更多的事情:
public string GetJSONString2(DataTable table)
{
StringBuilder headStrBuilder = new StringBuilder(table.Columns.Count * 5); //pre-allocate some space, default is 16 bytes
for (int i = 0; i < table.Columns.Count; i++)
{
headStrBuilder.AppendFormat("\"{0}\" : \"{0}{1}¾\",", table.Columns[i].Caption, i);
}
headStrBuilder.Remove(headStrBuilder.Length - 1, 1); // trim away last ,
StringBuilder sb = new StringBuilder(table.Rows.Count * 5); //pre-allocate some space
sb.Append("{\"");
sb.Append(table.TableName);
sb.Append("\" : [");
for (int i = 0; i < table.Rows.Count; i++)
{
string tempStr = headStrBuilder.ToString();
sb.Append("{");
for (int j = 0; j < table.Columns.Count; j++)
{
table.Rows[i][j] = table.Rows[i][j].ToString().Replace("'", "");
tempStr = tempStr.Replace(table.Columns[j] + j.ToString() + "¾", table.Rows[i][j].ToString());
}
sb.Append(tempStr + "},");
}
sb.Remove(sb.Length - 1, 1); // trim last ,
sb.Append("]}");
return sb.ToString();
}
答案 6 :(得分:-2)
如果您使用.net 3.0或3.5
,我建议使用不同的解决方案而不是这样做