【发布时间】:2019-03-07 09:46:23
【问题描述】:
我有一个原始数据列表,其中始终有 8 个数据值可用于一个时间戳 Date_Time。我想使用 linq 将 Data_Value 列的值按 Data_Type 排序为每个 Date_Time 的一行。
我有以下课程,并希望将其作为该课程的列表返回。
public class MeasurementData
{
public MeasurementData();
public int Test_ID { get; set; }
public int Channel { get; set; }
public string Date_Time { get; set; }
public double Current { get; set; }
public double Voltage { get; set; }
public double Charge_Capacity { get; set; }
public double Discharge_Capacity { get; set; }
}
这是代码的简化形式,我只是尝试提取四个值。
public static List<DataStructure.MeasurementData> RawResult(List<DataStructure.MeasurementRawTableSQL> rawData, int _Test_ID)
{
if (rawData != null)
{
var result = rawData.GroupBy(x => x.Date_Time)
.Select(gr =>
{
var _Date_Time = TicksToDate(gr.FirstOrDefault().Date_Time);
var _Channel = gr.FirstOrDefault().Channel;
var _Voltage = gr.Where(x => x.Data_Type == 21).FirstOrDefault().Data_Value;
var _Current = gr.Where(x => x.Data_Type == 22).FirstOrDefault().Data_Value;
var _Charge_Capacity = gr.Where(x => x.Data_Type == 23).FirstOrDefault().Data_Value;
var _Discharge_Capacity = gr.Where(x => x.Data_Type == 24).FirstOrDefault().Data_Value;
return new DataStructure.MeasurementData
{
Test_ID = _Test_ID,
Channel = _Channel,
Date_Time = _Date_Time,
Current = _Current,
Voltage = _Voltage,
Charge_Capacity = _Charge_Capacity,
Discharge_Capacity = _Discharge_Capacity
};
}
).ToList();
return result;
}
else return null;
}
这部分工作,对于案例 21 和 22,它为我提供了正确的值,而对于案例 23 和 24,我收到错误“对象引用未设置为对象的实例”。另一方面,数据库每个数据点都有这些行,并且永远不会为空。如果我只选择 First() 而不是 FirstOrDefault() 我会得到一个“序列不包含元素”。
我现在真的被困住了,真的很感谢你的帮助。
【问题讨论】:
-
您是否检查了 gr.Where(x => x.Data_Type == 23) 返回的内容?它是否返回一些数据?另外我猜你不需要写 gr.Where(x => x.Data_Type == 21).FirstOrDefault().Data_Value;而你可以只写 gr.FirstOrDefault(x => x.Data_Type == 21).Data_Value;
-
把双倍改成双倍?所以如果你有空值,代码就可以工作。
-
由于数据的时间不完全相同,您会收到错误消息。两个数据值可能相差 100ns,但您希望得到相同的结果。我建议使用圆形方法对时间进行分组。总金额取决于您获得新样本的频率。
-
感谢您的回复。 G_S:是的,但是对 23 的查询没有返回任何数据。 @jdweng:你能解释一下你所说的圆形方法是什么意思吗?或者给我一个例子的链接?
-
Math.Ceiling()、Math.Floor() 和 Math.Round() 方法。