"收起"和数据表

时间:2015-10-22 14:24:38

标签: c#

我有一个透视数据表,其中列是位置,大约有100个。数据有点奇怪,我正在寻找一种简单的方法来求和(或折叠数据)。

Date, Location 1, Location 2, Location 3
1/1/2001, 6, 0, 0
2/1/2001, 10, 0, 0
1/1/2001, 0, 5, 0
2/1/2001, 0, 4, 0
1/1/2001, 0, 0, 8
2/1/2001, 0, 0, 2

所以你可以看到零填充物,所以如果我要总结一下,我会得到唯一的日期列表和一个"崩溃的"结果没有零填充。

同样,我有大约100个列并且它们不能被硬编码,所以需要一种方法来动态地对所有这些列求和。有这个诀窍吗?也许在Linq?

2 个答案:

答案 0 :(得分:1)

如果第一列始终是日期而其余列总是总和,则可以在每行上迭代ItemArray

DataTable dt = new DataTable();
var sums = new Dictionary<DateTime, int>();

foreach(DataRow dr in dt.Rows)
{
    int sum = 0;
    for(int i = 1; i < dr.ItemArray.Length; i++)
    {
        sum += (int)dr.ItemArray[i];
    }

    sums.Add((DateTime)dr.ItemArray[0], sum);
}

答案 1 :(得分:1)

我会使用循环和LINQ的组合:

DataTable pivotedTable = table.Clone(); // same columns, empty
var pivotColumns = pivotedTable.Columns.Cast<DataColumn>().Skip(1).ToList(); 
var dateGroups = table.AsEnumerable()
    .GroupBy(r => r.Field<DateTime>("Date").Date);
foreach(var date in dateGroups)
{
    DataRow row = pivotedTable.Rows.Add(); // already added to table now
    row.SetField("Date", date.Key);
    foreach(DataColumn c in pivotColumns)
        row.SetField(c, date.Sum(r => r.Field<int>(c.ColumnName)));
}

以下是您的示例数据:

DataTable table = new DataTable();
table.Columns.Add("Date", typeof(DateTime));
table.Columns.Add("Location 1", typeof(int));
table.Columns.Add("Location 2", typeof(int));
table.Columns.Add("Location 3", typeof(int));
table.Rows.Add(new DateTime(2001, 1, 1), 6, 0, 0);
table.Rows.Add(new DateTime(2001, 2, 1), 10, 0, 0);
table.Rows.Add(new DateTime(2001, 1, 1), 0, 5, 0);
table.Rows.Add(new DateTime(2001, 2, 1), 0, 4, 0);
table.Rows.Add(new DateTime(2001, 1, 1), 6, 0, 8);
table.Rows.Add(new DateTime(2001, 1, 1), 6, 0, 2);

输出:

Date                    Location 1  Location 2  Location 3
01.01.2001 00:00:00      18          5           10
01.02.2001 00:00:00      10          4           0