是在循环中声明变量好,还是在循环中设置变量好?

本文关键字:变量 循环 设置 声明 | 更新日期: 2023-09-27 18:19:03

我有一个性能相关的查询,我试图了解哪个逻辑会更快。我的代码如下

list<string> test=new list<string>();
foreach (DataTable Dt in Product_DataSet.Tables)
{
  foreach (DataRow dr in Product_DataTable.Rows)
  {
    test.add(dr["ColumnName"].tostring());
    // Code to concatenate all string in list test to single variable
    // Code to pass single variable to DB
  }
}

在这里我遇到了问题,因为列表"测试"不断增长。所以我修改了我的内循环,像下面这样

foreach (DataRow dr in Product_DataTable.Rows)
{
  test.add(dr["ColumnName"].tostring());
  // Code to concatenate all string in list test to single variable
  // Code to pass single variable to DB
  test.Clear();
}

这是比

更好的选择吗?
foreach (DataRow dr in Product_DataTable.Rows)
{
  list<string> test=new list<string>();
  test.add(dr["ColumnName"].tostring());
  // Code to concatenate all string in list test to single variable
  // Code to pass single variable to DB
}

是在循环中声明变量好,还是在循环中设置变量好?

最后一个选项与第一个选项没有可比性,因为您总是创建一个新列表,而不是填充相同的列表。因此,在最后,它只包含最后一个表的行,而不是所有表的行。

所以这取决于你的需要。如果每个DataTable只需要一个,那么使用列表构造函数而不是List.Clear稍微好一些,因为后者必须做更多的事情。

所以,如果你需要一个包含所有表的所有字符串的大列表,为什么不首先填充列表而不是加载表呢?你可以使用DataReader

在我看来,你的两个选择是:

for  foreach (DataTable Dt in Product_DataSet.Tables)
{
    list<string> test=new list<string>();
    foreach (DataRow dr in Product_DataTable.Rows)
    {
        test.add(dr["ColumnName"].tostring();
    }
    //code to concat and send to db
}

list<string> test=new list<string>();
for  foreach (DataTable Dt in Product_DataSet.Tables)
{
    test.Clear();
    foreach (DataRow dr in Product_DataTable.Rows)
    {
        test.add(dr["ColumnName"].tostring();
    }
    //code to concat and send to db
}

我非常怀疑它在性能方面有多少:在每种情况下,所有内容都必须被垃圾收集。但是你可以用大量的数据来测试它,看看会发生什么。