旋转输入数据 - 有我可以使用的结构吗?

Pivoting input data - is there a structure I can use?

我将输入数据作为对象列表给出:

Name: "Room A",
Time: "15:00",
Topic: "Some Topic"

Name: "Room A",
Time: "18:00",
Topic: "Some Other Topic"

Name: "Room B",
Time: "12:00",
Topic: "Some More Topic"

Name: "Room C",
Time: "13:00",
Topic: "Even More Topic"

我必须从中创建不同的 table。首先,应该有一个 table,其中行基于时间,列基于名称,但将来,当对象增长时,我希望能够围绕其他属性进行调整。

我想编写如下代码:

var structure = new SomeCSharpStructure(); // <------

for(int i=0;i<24) structure.AddRow(i+":00");

foreach(var name in inputData.Select(x=>x.Name).Distinct()) structure.AddColumn(name);

foreach(var data in inputData) {
    structure[data.Name][data.Time] = data.Topic; // or
    // structure.AddCell(data.Name,data.Time,data.Topic);
}

...

foreach(var row in structure.getRows()) foreach(var cell in row.getCell())
{
     PrintCellContent(cell);
}

虽然我也愿意接受其他建议。

但现在我正在寻找一种结构,它可以支持这种实例化,而不会到处溢出 NullPointerExceptionsIndexOutOfRangeExceptions。在我自己实施之前,我想确保有 none 可用。

有人知道适合我需要的结构吗?

您可以使用已经实现数据透视 table 计算的 NReco.PivotData 库(我是该库的作者,它可用于自由)。它提供数据透视表结构,用于根据行和列访问 table 值:

var pvtData = new PivotData(new[] {"Name", "Time"}, new CountAggregatorFactory() );
pvtData.ProcessData( inputData, new ObjectMember().GetValue );
var pvtTbl = new PivotTable(new[] {"Name"}, new[] {"Time"}, pvtData);
var columns = pvtTbl.ColumnKeys;
var rows = pvtTbl.RowKeys;
var cellValue = pvtTbl[0,0].Value; // get first cell value

一些解释:

  • PivotData class 构建内存立方体(多维数据集)并执行数据聚合
  • ObjectMember 为维度值提供 POCO 模型 属性 访问器
  • 数据透视表 class 提供 table 模型,可用于数据透视表 table 渲染。可用于获取总计和小计。