如何计算差异和存储?

时间:2015-05-01 10:42:59

标签: c# .net variables difference

我想计算变量中的差值存储。

示例数据库:

Id   RS
--   --
1    10
2    25
3    33
4    44
.    .
.    .

我想计算1& 2,2& 3,3& 4(ID)之间的差异,我必须将总数存储到变量中。 (25-10 = 15, 33-25=8, 44-33=11) 输出应该是34。 我坚持使用下面给出的代码。

代码:

protected void btnSubmit_Click(object sender, EventArgs e)
{
   RsTableAdapters.tbl_RS_detailsTableAdapter sd;
   sd = new RsTableAdapters.tbl_RS_detailsTableAdapter();
   DataTable dt = new DataTable();     
   dt = sd.GetData();
   foreach (DataRow row in dt.Rows)
     {                
         string rsValue = (row["RS"].ToString()); // here getting first value (10)
     }
}

3 个答案:

答案 0 :(得分:2)

您可以使用linq:

var differences = from row1 in dt.Rows
join row2 in dt.Rows on (int)row1["ID"] equals (int) row2["ID"] + 1
select (int)row2["RS"] - (int)row1["RS"];
var sumofdiffs = differences.Sum();

只要“RS”和“ID”是整数,如果不是,你应该先解析它。这种方法不需要ID的排序元素,它的缺点 - 复杂度O(n ^ 2),简单性。

修改 如所指出的,复杂性可能甚至比O(n ^ 2)更好,如果linq能够在相等条件下使用散列,则它可以比分类数据O(n log n)的准备更简单地分摊O(n)。

答案 1 :(得分:1)

试试这个:它会记住前一行的值来计算除第一行之外的每一行的差异和总和。

 int sum = 0;
 int diff;
 bool first = true;
 int oldValue;
 foreach (DataRow row in dt.Rows)
 {                
     int value = row["RS"];
     if(!first)
     { 
         diff = value - oldValue;
         sum += diff;
         first = false;
     }
     oldValue = value;
 }

您必须确保返回的数据按ID排序才能使其正常工作

答案 2 :(得分:1)

您可以尝试这样的事情:

var drs = dt.Rows.Cast<DataRow>()
int last = (int)drs.Last()["RS]
int first = (int)drs.First()["RS"]
int diff = last - first

正如其他人所说,您需要按ID对数据进行排序。

Select RS from tbl_RS_details order by ID