2015-05-01 4 views
0

Я хочу вычислить хранилище разностей в переменной.как рассчитать разницу и сохранить?

Образец БД:

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) 
    } 
} 
+0

Вы должны убедиться, что ваш возвращаемые данные отсортированы по ID, чтобы сделать эту работу – DrKoch

+2

наблюдение, может быть, вам сэкономить некоторое время: как явствует из вашего описания, вы используете каждую запись, но первый и последний раз два раза, один раз с + и один раз -. Таким образом, они отменяют друг друга, и ваша окончательная сумма - это просто разница между последним значением и первым значением. Как и в вашем примере 44 - 10 = 34 (а не 29, так как у вас есть 25-10 = 10 по какой-то причине) – Andrei

+0

@Andrei: Я понял, что вы сказали, есть ли у нас другой вариант? – Reshma

ответ

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

Вы можете использовать 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 "являются целыми числами, если вы не должны сначала его разобрать. Этот подход не требует сортировки элементов по идентификатору, его недостаток - сложность O (n^2), про-простота.

Edit: Как отметил сложность может быть даже лучше, чем O (N^2), если LINQ будет иметь возможность использовать хэши в условии равенства он может получить амортизируется O (N), так проще, чем подготовка отсортированные данные O (n log n).

+1

Это должно быть даже лучше, чем O (N^2), потому что' join' интеллектуально и использует хеш-таблицы под капотом. – Rawling

1

Вы могли бы попробовать что-то вроде этого:

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

Как уже говорили другие, вам нужны данные должны быть отсортированы по идентификатору.

Select RS from tbl_RS_details order by ID 
Смежные вопросы