C# 为什么这个循环这么慢?

C# 为什么这个循环这么慢?,c#,performance,loops,C#,Performance,Loops,我试图寻找一个原因来解释为什么这个循环如此缓慢,但我还没有得到一个好的答案。执行以下循环需要一分钟: string answer = ""; string headers = ""; string datarows = ""; bool firstRun = true; foreach (Dictionary<string, string> row in JSON) {

我试图寻找一个原因来解释为什么这个循环如此缓慢,但我还没有得到一个好的答案。执行以下循环需要一分钟:

        string answer = "";
        string headers = "";
        string datarows = "";
        bool firstRun = true;
        foreach (Dictionary<string, string> row in JSON)
        {
            datarows += "<tr>";
            foreach (KeyValuePair<String, String> cell in row)
            {
                if (firstRun) { headers += "<th>" + cell.Key + "</th>"; }
                datarows += "<td>" + cell.Value + "</td>";
            }
            datarows += "</tr>";
            firstRun = false;
        }
        answer += "<table><tr>" + headers + "</tr>" + datarows + "</table>";
        return answer;
string-answer=“”;
字符串标题=”;
字符串datarows=“”;
bool firstRun=true;
foreach(JSON中的字典行)
{
数据行+=“”;
foreach(行中的KeyValuePair单元格)
{
if(firstRun){headers+=“”+cell.Key+“”;}
数据行+=“”+单元格.值+“”;
}
数据行+=“”;
firstRun=false;
}
答案+=“”+标题+“”+数据行+“”;
返回答案;

JSON变量是一个列表,包含大约1150个字典。每个字典包含9个键值对。有什么想法吗?

最明显的问题是字符串连接

每次附加到字符串时,实际上是在附加到字符串的副本(因为每个字符串都是不可变的)。这可能非常昂贵


您应该选择a,或者,对于生成这样的HTML,您可能需要研究-这将有助于处理HTML的“格式良好”等问题。

出现的明显问题是字符串连接

每次附加到字符串时,实际上是在附加到字符串的副本(因为每个字符串都是不可变的)。这可能非常昂贵

您应该选择a,或者,对于生成这样的HTML,您可能需要研究-这将有助于处理HTML的“格式良好”等问题。

尝试使用a而不是手动连接字符串

按照您的操作方式,每次向字符串末尾添加更多内容时,都会重新计算字符串,每次都会重新生成字符串,这是非常昂贵的。StringBuilder对于这种类型的工作效率要高得多。

尝试使用字符串而不是手动连接字符串


按照您的操作方式,每次向字符串末尾添加更多内容时,都会重新计算字符串,每次都会重新生成字符串,这是非常昂贵的。StringBuilder在这类工作中效率更高。

每当您附加到字符串时,旧字符串将被销毁,新字符串将被创建

所以你放的越多,字符串的凝聚速度就越慢


如果使用StringBuilder,速度应该会快得多。

每当附加到字符串时,旧字符串将被销毁,新字符串将被创建

所以你放的越多,字符串的凝聚速度就越慢


如果您换用StringBuilder,速度应该会快得多。

您是否尝试将字符串类型更改为必须连接的StringBuilder

StringBuilder answer=new StringBuilder();
StringBuilder标头=新的StringBuilder();
StringBuilder datarows=新建StringBuilder();
bool firstRun=true;
foreach(JSON中的字典行)
{
datarows.Apeend(“”);
foreach(行中的KeyValuePair单元格)
{
if(firstRun){headers.Apeend(“+cell.Key+”);}
datarows.Append(“+cell.Value+”);
}
datarows.Append(“”);
firstRun=false;
}
答案。追加(“+标题+”+数据行+”);
返回response.toString();

是否尝试将字符串类型更改为必须连接的StringBuilder

StringBuilder answer=new StringBuilder();
StringBuilder标头=新的StringBuilder();
StringBuilder datarows=新建StringBuilder();
bool firstRun=true;
foreach(JSON中的字典行)
{
datarows.Apeend(“”);
foreach(行中的KeyValuePair单元格)
{
if(firstRun){headers.Apeend(“+cell.Key+”);}
datarows.Append(“+cell.Value+”);
}
datarows.Append(“”);
firstRun=false;
}
答案。追加(“+标题+”+数据行+”);
返回response.toString();

您是否尝试过StringBuilder是否有帮助?我建议您使用StringBuilder而不是字符串连接。它不会解决所有的性能问题,但它也可以帮助if(firstrun)在每个迭代中运行,但仅用于第一个。对JSON的调用是否会调用网络调用?对于9*1k,这肯定是字符串上的
+=
存在问题的领域。您是否尝试过StringBuilder是否有帮助?我建议您使用StringBuilder而不是字符串连接。它不会解决所有的性能问题,但它也可以帮助if(firstrun)在每次迭代中运行,但只在第一次迭代中使用。对JSON的调用是否会调用网络调用?对于9*1k,这肯定是字符串上的
+=
问题所在。感谢大家的快速反馈!从现在起,我会记得使用字符串生成器。感谢大家的快速反馈!从现在起,我将记住使用字符串生成器。
StringBuilder answer = new StringBuilder();
StringBuilder headers = new StringBuilder();
StringBuilder datarows = new StringBuilder();
bool firstRun = true;
foreach (Dictionary<string, string> row in JSON)
{
    datarows .Apeend("<tr>");
    foreach (KeyValuePair<String, String> cell in row)
    {
        if (firstRun) { headers.Apeend("<th>" + cell.Key + "</th>"); }
        datarows.Append("<td>" + cell.Value + "</td>");
    }
     datarows.Append("</tr>");
    firstRun = false;
}
answer.Append("<table><tr>" + headers + "</tr>" + datarows + "</table>");
return answer.toString();