0

在这里,我使用 for 循环将数据网格的元素存储在字符串生成器中,但是当有大量行时,它会花费太多时间。是否有另一种方法可以在更短的时间内将数据复制到字符串生成器?

for (int a = 0; a < grdMass.RowCount; a++)
     {
         if (a == 0)
             {
                 _MSISDN.AppendLine("'" + grdMass.Rows[a].Cells[0].Value.ToString() + "'");

              }
          else
             {
               _MSISDN.AppendLine(",'" + grdMass.Rows[a].Cells[0].Value.ToString() + "'");
             }
     }          
4

5 回答 5

3

鉴于您提供的信息,无法改进此代码。这是一个简单的for循环,将字符串附加到 a StringBuilder- 这里没有很多可以优化的事情。

这可能是仅仅因为您正在处理大量数据而需要很长时间的情况之一。也许有一种方法可以缓存这些数据,这样您就不必经常生成它。您还有什么可以告诉我们的可以帮助我们找到更好的方法吗?


旁注:验证您对导致缓慢的特定代码部分的怀疑非常重要。通过分析您的代码来做到这一点,这样您就不会花时间尝试解决其他地方存在的问题。

于 2009-12-21T04:17:44.983 回答
3

正如其他人所说,这StringBuilder与您将获得的速度差不多,因此假设这是唯一可能导致您减速的代码,您可能无能为力......但您可以稍微优化通过删除您正在执行的少量字符串连接来实现。IE:

for (int a = 0; a < grdMass.RowCount; a++)
{
    if (a == 0)
    {
        _MSISDN.Append("'");
    }
    else
    {
        _MSISDN.Append(",'");
    }
    _MSISDN.Append(grdMass.Rows[a].Cells[0].Value);
    _MSISDN.AppendLine("'");
}

编辑:您也可以像这样清理if声明(尽管我非常怀疑它是否具有明显的效果):

//First row
if (grdMass.RowCount > 0)
{
    _MSISDN.Append("'");
    _MSISDN.Append(grdMass.Rows[0].Cells[0].Value);
    _MSISDN.AppendLine("'");
}
//Second row onwards
for (int a = 1; a < grdMass.RowCount; a++)
{
    _MSISDN.Append(",'");
    _MSISDN.Append(grdMass.Rows[a].Cells[0].Value);
    _MSISDN.AppendLine("'");
}
于 2009-12-21T04:25:41.390 回答
1

我怀疑不是字符串构建需要很长时间,也许是访问缓慢的网格元素。

你可以像这样重写你的代码:

var cellValues = grdMass.Rows
    .Select(r => "'" + r.Cells[0].Value.ToString() + "'")
    .ToArray();

return String.Join(",", cellValues);

现在您可以验证哪个部分花费的时间最多。它是构建 cellValues 数组,还是 String.Join 调用?

于 2009-12-21T13:57:39.170 回答
0

StringBuilder 几乎与构建字符串一样快——而且速度非常快。如果 StringBuilder 太慢,您可能试图一次性处理太多数据。您确定确实是字符串构建速度很慢,而不是处理的其他部分吗?

一个可以为非常大的字符串加速 StringBuilder 的技巧:预先设置容量。也就是说,调用StringBuilder(int)构造函数而不是默认构造函数,传递您计划编写的字符数的估计值。如果你低估它仍然会扩大——这只是节省了最初的“好吧,1K 还不够,时间分配另一个 2K……4K……等等”。但这只会产生很小的影响,而且只有在你的字符串长的情况下。

于 2009-12-21T04:20:17.893 回答
0

这样会更好......

 if (grdMass.RowCount > 0)
 {
      _MSISDN.AppendLine("'" + grdMass.Rows[0].Cells[0].Value.ToString() + "'");

      for (int a = 1; a < grdMass.RowCount; a++)
      {
            _MSISDN.AppendLine(",'" + grdMass.Rows[a].Cells[0].Value.ToString() + "'");
      }     
 }
于 2009-12-21T04:28:33.200 回答