Чистый способ создания совокупной суммы столбцов в нескольких DataRows - PullRequest
0 голосов
/ 17 ноября 2011

У меня есть серия объектов DataRow, каждый с кучей разных полей.Что я хочу сделать, это создать новый объект DataRow с суммой определенных десятичных полей.Прямо сейчас мой код выглядит примерно так:

DataRow tally = myTable.NewRow();

foreach (DataRow row in myTable.Rows)
{
   if (row["SomeField"] != DBNull.Value)
      tally["SomeField"] = (tally["SomeField"] is DBNull ? 0 : (Decimal)tally["SomeField"]) + (Decimal)row["SomeField"];

   // ...     
}

Мне нужно сделать то же самое примерно с 20 другими полями, но я думаю, что код невероятно запутан из-за приведения типов и проверки нуля.Возможно, есть способ реорганизовать этот код, чтобы он был немного более читабельным?

Примечание: я хочу только подсчитать определенные столбцы, в противном случае я бы, скорее всего, просто перебрал бы столбцы в DataRow, а не повторял быкод выше 20 раз.

Ответы [ 4 ]

1 голос
/ 17 ноября 2011

Вот простой пример, если вы хотите сделать это с помощью LINQ.

DataTable table = new DataTable();
table.Columns.Add("Desc", typeof(string));
table.Columns.Add("Qty", typeof(decimal));
table.Columns.Add("Price", typeof(decimal));

table.Rows.Add(new object[] { "Product", 1, 2 });
table.Rows.Add(new object[] { "Product", 2, 10 });
table.Rows.Add(new object[] { "Product", 3, null });

var totalQty = table.AsEnumerable().GroupBy(l => l.Field<string>("Desc"))
    .Select(r =>
        new {   Desc = r.Key,
                TotalQty = r.Sum(w => w.Field<decimal?>("Qty")),
                TotalPrice = r.Sum(w => w.Field<decimal?>("Price")),
        });

даст и объект с тремя свойствами. Обратите внимание, что вам нужно преобразовать столбец decimal в decimal? для поддержки любых нулевых значений, которые могут встречаться в таблице.

Desc = "Product", TotalQty = 6, TotalPrice = 12
1 голос
/ 17 ноября 2011

Вы можете переместить свой код вычисления в новый метод:

private void Tally(DataRow tally, DataRow row, int index)
{
    if (row[index] != DBNull.Value)
    {
        tally[index] = (tally[index] == DBNull.Value ? 0 : (decimal)tally[index]) + (decimal)row[index];
    }
}

и использовать массив индексов для столбцов, которые вы хотите подсчитать:

DataRow tally = myTable.NewRow();

int[] indexes = new int[] { 0, 2 };

foreach(DataRow row in myTable.Rows)
{
    foreach(int index in indexes)
    {
        Tally(tally, row, index);
    }
}
0 голосов
/ 17 ноября 2011

Вы также можете использовать метод Compute класса DataTable: Метод DataTable.Compute в MSDN .

0 голосов
/ 17 ноября 2011

Вы можете использовать Linq для DataSets и Sum: http://msdn.microsoft.com/en-us/vstudio/bb738016#sumsimp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...