有没有比使用循环更快的方法来处理元素序列?

时间:2009-12-21 04:12:30

标签: c# datagrid loops performance stringbuilder

这里我使用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() + "'");
             }
     }          

5 个答案:

答案 0 :(得分:3)

根据您提供的信息,无法改进此代码。这是一个简单的for循环,它将字符串附加到StringBuilder - 这里没有可以优化的全部内容。

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


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

答案 1 :(得分:3)

正如其他人所说的那样,StringBuilder的速度和你想要的一样快,所以假设这是可能导致你减速的唯一代码,你可能做的不多...但您可以通过删除正在执行的少量字符串连接来稍微优化它。即:

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("'");
}

答案 2 :(得分:1)

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

您可以像这样重写代码:

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

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

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

答案 3 :(得分:0)

StringBuilder与构建字符串的速度相当快 - 而且速度非常快。如果StringBuilder太慢,您可能会尝试一次处理太多数据。你确定它真的是字符串构建很慢而不是处理的其他部分吗?

一个提示可以加速StringBuilder的非常大的字符串:预先设置容量。也就是说,调用StringBuilder(int)构造函数而不是默认构造函数,传递对计划编写的字符数的估计。如果你低估它仍然会扩大 - 这只是保存了最初的“好吧,1K还不够,时间分配另外2K ...... 4K ......等等”但这只会产生很小的差异,并且只有当你的字符串非常很长时才会发生。

答案 4 :(得分: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() + "'");
      }     
 }