在Foreach循环上获得以前的价值

时间:2016-05-24 15:28:11

标签: asp.net loops foreach

如何使用foreach循环

实现以下语句
for(int i = 0; i<=dt.Rows.Count -1; i++)
{
  var quote = Convert.ToDouble(dt.Rows[i]["Data"]) - Convert.ToDouble(dt.Rows[i-1]["Data"])

}

当我使用foreach循环时:

foreach (DataRow row in dt.Rows)
{
       // how can i write this statement like the loop above. 
}

2 个答案:

答案 0 :(得分:0)

您可以在循环的每次迭代中存储先前的值,以便在下一次迭代中使用。

var prev = 0;
foreach (DataRow row in dt.Rows)
{
     var quote = Convert.ToDouble(row["Data"]) - Convert.ToDouble(prev);
     prev = row["Data"];
}

如何设置初始值为0的报价:

double quote = 0.0;
var prev = 0;
foreach (DataRow row in dt.Rows)
{
     quote = Convert.ToDouble(row["Data"]) - Convert.ToDouble(prev);
     prev = row["Data"];
}

在循环的第一次迭代中将引号设置为0的另一种方法:

var prev = 0;
var i = 0;
foreach (DataRow row in dt.Rows)
{
     double quote;
     if(i == 0) 
     {
          quote = 0.0;
     } 
     else 
     {
          quote = Convert.ToDouble(row["Data"]) - Convert.ToDouble(prev);
     }
     prev = row["Data"];
     i++;
}

注意:最后一个例子,基于OP对我的回答的评论,实际上只是在黑暗中被刺,因为OP没有给出明确的定义。这些附加示例实际上超出了原始问题的范围。

答案 1 :(得分:0)

如果您使用foreach循环,则不会有索引但只有当前项目。因此,如果您想访问之前的DataRow,则应使用for - 循环,就像您的第一种方法一样。但是你可以把它写得更具可读性和效率:

for(int i = 1; i < dt.Rows.Count -1; i+=2)
{
    double thisData = dt.Rows[i].Field<double>("Data");
    double prevData = dt.Rows[i-1].Field<double>("Data");
    double quote = thisData - prevData;
}