我有一个与性能相关的查询,我试图了解哪个逻辑会更快。 我的代码如下所示
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
}
答案 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
。