C# &引用;“崩溃”;和和数据表

C# &引用;“崩溃”;和和数据表,c#,C#,我有一个数据透视表,其中列是位置,大约有100个。数据有点奇怪,我正在寻找一种简单的求和(或折叠数据)方法 所以你们可以看到有零填充物,所以若我要总结,我会得到唯一的日期列表和一个没有零填充物的“折叠”结果 同样,我有大约100列,它们不能硬编码,所以需要一种方法来动态求和所有这些列。这有什么诀窍吗?可能在Linq?中,如果第一列始终是日期,而其余列始终是总和,则可以在每行上迭代ItemArray DataTable dt = new DataTable(); var sums = new Di

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

所以你们可以看到有零填充物,所以若我要总结,我会得到唯一的日期列表和一个没有零填充物的“折叠”结果


同样,我有大约100列,它们不能硬编码,所以需要一种方法来动态求和所有这些列。这有什么诀窍吗?可能在Linq?

中,如果第一列始终是日期,而其余列始终是总和,则可以在每行上迭代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);
}
DataTable dt=newdatatable();
var sums=新字典();
foreach(数据行dr在dt.行中)
{
整数和=0;
for(int i=1;i
我将使用循环和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)));
}
输出:

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

我丢失了你的密码。甚至不清楚您是否指的是
System.Data.DataTable
我没有任何代码。我可以手动按日期分组,按每列求和,但这并没有给我动态性,也没有给我一个事实,我有很多列,这是一种更动态的方式。我正在寻找关于在有大量动态列时如何分组/求和的代码想法。我不能在这个网站上询问代码的想法吗?因此,上面显示的示例数据只是一个简短的示例,以了解100列中3列的数据可能是什么样子,如果我正确的话,需要将其存储在表中。你是从哪里得到这些数据的?我认为这仍然是一个有用的信息,可以了解oyu在那里可以使用哪些选项。是否所有要透视的列都以
位置开始。它们是不同的城市名称。有趣。所以这不会以任何方式将列名链接到值,对吗?也许我可以添加这些,删除数据表中的记录,然后插入sums字典,它应该是正确的列顺序?所以我希望结果仍然是透视的。因此,最终输出的列是日期、位置1、位置2和位置3。只是不是6行,而是只有2行(2010年1月1日和2010年2月1日)。是的,是关于变化的月份(我有1月和2月)。我想你已经得到了!接受。@user441521:你说得对,添加了样本数据和输出
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