在循环中声明变量或在循环中设置变量是否更好?

时间:2014-08-22 12:16:20

标签: c# variables

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

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
  }
}

在这里,我遇到了问题列表&#34; test&#34;不断成长所以我修改了我的内循环,如下所示

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
}

2 个答案:

答案 0 :(得分:1)

在我看来,好像你有两个选择:

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
}

我非常怀疑其中有很多内容,性能方面:在每种情况下,所有内容都必须进行垃圾回收。但你可以用大量数据对其进行测试,看看会发生什么。

答案 1 :(得分:1)

最后一个选项与第一个选项无法比较,因为您总是创建一个新列表而不是填充相同的列表。所以最后它只包含最后一个表的行,而不是所有表的行。

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

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