Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在循环中声明变量还是在循环中设置变量更好_C#_Variables - Fatal编程技术网

C# 在循环中声明变量还是在循环中设置变量更好

C# 在循环中声明变量还是在循环中设置变量更好,c#,variables,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 conc

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

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
}
foreach(产品中的数据行dr\u DataTable.Rows)
{
列表测试=新列表();
test.add(dr[“ColumnName”].tostring());
//将列表测试中的所有字符串连接到单个变量的代码
//将单个变量传递给DB的代码
}

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

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
}
foreach的
(Product_DataSet.Tables中的DataTable Dt)
{
列表测试=新列表();
foreach(Product_DataTable.Rows中的DataRow dr)
{
test.add(dr[“ColumnName”].tostring();
}
//编码到concat并发送到db
}

list test=newlist();
对于foreach(Product_DataSet.Tables中的DataTable Dt)
{
test.Clear();
foreach(Product_DataTable.Rows中的DataRow dr)
{
test.add(dr[“ColumnName”].tostring();
}
//编码到concat并发送到db
}

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

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

因此,这取决于您的需要。如果每个
DataTable
只需要一个,那么使用列表构造函数要好一些,因为后者需要做更多的事情


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

最后一个选项将不起作用-因为您不会“添加”到列表中,只需为每个元素创建一个“新”列表。)除非这是你正在尝试做的)看起来他们将要使用然后清除?所以你有没有试着做基准测试,看看哪个更快?问了40个问题后,你应该知道如何在这里缩进一段代码。@terribleProgrammer-阅读注释。第三个示例很好(可能是最好的)示例2和3看起来做了相同的事情,但第一个做了非常不同的事情。我只有一个数据表。所以我想最好为datatable中的每一新行声明一个新列表。@MarsOne:如果只有一个表,那就没关系了。但您不应该为每一行创建一个列表,这似乎毫无意义。你到底需要这份清单干什么?如果要将数据行的多个字段连接到单个变量,则不需要列表,而需要
String.Concat
(或
“a”+“b”
)。我认为最好使用.clear()选项。我读了关于同一主题的另一个问题,我相信这是一个更好的解决问题的方法go@MarsOne:
List.Clear
并不比
newlist()好,因为它做得更多。
List.Clear的成本取决于它的大小。因此,如果列表已经非常大,那么可能会有明显的差异。
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
}