我有一个数据集作为C#中的对象列表,看下面的内容。
public class MotorDataModel
{
public DateTime timestamp { set; get; }
public decimal MotorSpeed { set; get; }
public decimal MotorTemp { set; get; }
public decimal MotorKw{ set; get; }
}
public class MotorModel
{
public string MotorName { set; get; }
public List<MotorDataModel> MotorData { set; get; }
}
当我进行查询时,我将返回一个或多个MotorModel记录(比如电机1,2,3,...),每个记录都有自己的时间戳,以及这些时间戳记的各种数据点。
然后我将此数据发送到javascript图表库,该图表将数据作为数据表格(例如电子表格格式),例如:
TimeStamp |电机1:kW |电机1:速度| Motor1:Temp |电机2:kW |电机2:速度......
行中的数据。数据将按时间戳分组,时间戳应该在几分钟之内,以一致的增量(比如15分钟)。
计划是转换C#中的数据,将其转换为JSON,然后将其发送到图表库(Google Chart)。
我不需要在C#中对其进行格式化,并且可以将C#中的对象列表数据转换为JSON,并在客户端上使用javascript重新格式化,但最好在服务器上对其进行转换。
无论哪种方式,我都在努力研究如何将数据从多个对象列表转换为“数据表”视图。
通过LINQThis answer似乎很接近,但我有多个设备列表,而不是定义的数字。
我还看过循环并构建数据表(或数组),但不确定哪种结构最有意义。
因此,如果有人做过类似的事情,或者有任何反馈意见,那将非常感激。
提供样本数据的建议格式
以下是BlueMonkMN提供的一些示例数据。请更新提供代表您实际问题的样本数据的问题。
List<MotorModel> allData = new List<MotorModel>() {
new MotorModel() {MotorName="Motor1", MotorData = new List<MotorDataModel> {
new MotorDataModel(){timestamp=new DateTime(2016, 9, 18, 2, 56, 0), MotorSpeed=20.0M, MotorTemp=66.2M, MotorKw=5.5M},
new MotorDataModel(){timestamp=new DateTime(2016, 9, 18, 3, 10, 30), MotorSpeed=10.0M, MotorTemp=67.0M, MotorKw=5.5M},
new MotorDataModel(){timestamp=new DateTime(2016, 9, 18, 3, 25, 45), MotorSpeed=17.5M, MotorTemp=66.1M, MotorKw=5.8M},
new MotorDataModel(){timestamp=new DateTime(2016, 9, 18, 3, 40, 23), MotorSpeed=22.2M, MotorTemp=65.8M, MotorKw=5.4M}
}},
new MotorModel() {MotorName="Motor2", MotorData = new List<MotorDataModel> {
new MotorDataModel(){timestamp=new DateTime(2016, 9, 18, 2, 58, 0), MotorSpeed=21.0M, MotorTemp=67.2M, MotorKw=5.6M},
new MotorDataModel(){timestamp=new DateTime(2016, 9, 18, 3, 11, 30), MotorSpeed=11.0M, MotorTemp=68.0M, MotorKw=5.6M},
new MotorDataModel(){timestamp=new DateTime(2016, 9, 18, 3, 24, 45), MotorSpeed=18.5M, MotorTemp=67.1M, MotorKw=5.9M},
new MotorDataModel(){timestamp=new DateTime(2016, 9, 18, 3, 39, 23), MotorSpeed=23.2M, MotorTemp=66.8M, MotorKw=5.5M}
}}
};
答案 0 :(得分:0)
一种可能性是遍历所有数据,并按照您的建议构建表格。我建议使用Dictionary
,时间戳为关键。对于每个时间戳,可以有多个MotorData,因此它可以有一个列表,如下所示:
Dictionary<DateTime, List<MotorDataModel>>
构建此表的代码段如下所示:
List<MotorModel> motorModels; // filled in previously
// build result structure in this dictionary:
Dictionary<DateTime, List<MotorDataModel>> table = new Dictionary<DateTime, List<MotorDataModel>>();
// iterate through all motors and their data, and fill in the table
foreach(MotorModel m in motorModels)
{
foreach(MotorDataModel md in m.MotorData)
{
DateTime ts = md.timestamp;
// if this is the first occurance of the timestamp, create new 'row'
if (!table.ContainsKey(ts)) table[ts] = new List<MotorDataModel>();
// add the data to the 'row' of this timestamp
table[ts].Add(md);
}
}
// output the table
foreach(DateTime ts in table.Keys)
{
...
foreach(MotorDataModel md in table[ts])
{
...
}
}
答案 1 :(得分:0)
我使用NewtonSoft的Json.NET。
style
答案 2 :(得分:0)
您可以尝试这样的计算数据:
var motorData = allData.SelectMany(x => x.MotorData).ToArray();
var starting = motorData.Min(x => x.timestamp);
var ending = motorData.Max(x => x.timestamp);
var duration = ending.Subtract(starting);
var blocks = (int)Math.Ceiling(duration.TotalMinutes / 15.0);
var query =
from b in Enumerable.Range(0, blocks)
let s = starting.AddMinutes(b * 15.0)
let e = starting.AddMinutes((b + 1.0) * 15.0)
select new
{
Timestamp = s,
MotorSpeedAverage =
motorData
.Where(x => x.timestamp >= s && x.timestamp < e)
.Average(x => x.MotorSpeed),
};
我得到了这个结果: