C#根据时间戳

时间:2016-09-19 19:39:22

标签: c# json linq object

我有一个数据集作为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重新格式化,但最好在服务器上对其进行转换。

无论哪种方式,我都在努力研究如何将数据从多个对象列表转换为“数据表”视图。

通过LINQ

This 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}
        }}
     };

3 个答案:

答案 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),
    };

我得到了这个结果:

query