【问题标题】:Suggestions for LINQ queryLINQ 查询的建议
【发布时间】:2011-12-20 12:17:53
【问题描述】:

我有以下用于在列表中存储数据的类:

public class Values
    {
        public int ParamId { get; set; }
        public DateTime TimeStamp { get; set; }
        public double Value { get; set; }
    }

我正在做以下事情:

IList<Values> val = new List<Values>();
//12 december 2011 10 hour
Values v1 = new Values { ParamId = 100, TimeStamp = new DateTime(2011, 12, 20, 10, 0, 0), Value = 345.0d };
Values v2 = new Values { ParamId = 100, TimeStamp = new DateTime(2011, 12, 20, 10, 0, 1), Value = 350.0d };
Values v3 = new Values { ParamId = 100, TimeStamp = new DateTime(2011, 12, 20, 10, 0, 2), Value = 355.0d };
Values v4 = new Values { ParamId = 100, TimeStamp = new DateTime(2011, 12, 20, 10, 0, 3), Value = 344.0d };

Values g1 = new Values { ParamId = 101, TimeStamp = new DateTime(2011, 12, 20, 10, 0, 0), Value = 3000.0d };
Values g2 = new Values { ParamId = 101, TimeStamp = new DateTime(2011, 12, 20, 10, 0, 1), Value = 3100.0d };
Values g3 = new Values { ParamId = 101, TimeStamp = new DateTime(2011, 12, 20, 10, 0, 2), Value = 3150.0d };
Values g4 = new Values { ParamId = 101, TimeStamp = new DateTime(2011, 12, 20, 10, 0, 3), Value = 3125.0d };

Values v5 = new Values { ParamId = 100, TimeStamp = new DateTime(2011, 12, 20, 10, 3, 0), Value = 355.0d };
Values v6 = new Values { ParamId = 100, TimeStamp = new DateTime(2011, 12, 20, 10, 3, 1), Value = 360.0d };
Values v7 = new Values { ParamId = 100, TimeStamp = new DateTime(2011, 12, 20, 10, 3, 2), Value = 365.0d };
Values v8 = new Values { ParamId = 100, TimeStamp = new DateTime(2011, 12, 20, 10, 3, 3), Value = 360.0d };

Values g5 = new Values { ParamId = 101, TimeStamp = new DateTime(2011, 12, 20, 10, 3, 0), Value = 3150.0d };
Values g6 = new Values { ParamId = 101, TimeStamp = new DateTime(2011, 12, 20, 10, 3, 1), Value = 3200.0d };
Values g7 = new Values { ParamId = 101, TimeStamp = new DateTime(2011, 12, 20, 10, 3, 2), Value = 3250.0d };
Values g8 = new Values { ParamId = 101, TimeStamp = new DateTime(2011, 12, 20, 10, 3, 3), Value = 3225.0d };
//............... up to 57 minutes

Values v9 = new Values { ParamId = 100, TimeStamp = new DateTime(2011, 12, 20, 10, 57, 0), Value = 350.0d };
Values v10 = new Values { ParamId = 100, TimeStamp = new DateTime(2011, 12, 20, 10, 57, 1), Value = 365.0d };
Values v11 = new Values { ParamId = 100, TimeStamp = new DateTime(2011, 12, 20, 10, 57, 2), Value = 367.0d };
Values v12 = new Values { ParamId = 100, TimeStamp = new DateTime(2011, 12, 20, 10, 57, 3), Value = 370.0d };

Values g9 = new Values { ParamId = 101, TimeStamp = new DateTime(2011, 12, 20, 10, 57, 0), Value = 3250.0d };
Values g10 = new Values { ParamId = 101, TimeStamp = new DateTime(2011, 12, 20, 10, 57, 1), Value = 3240.0d };
Values g11 = new Values { ParamId = 101, TimeStamp = new DateTime(2011, 12, 20, 10, 57, 2), Value = 3200.0d };
Values g12 = new Values { ParamId = 101, TimeStamp = new DateTime(2011, 12, 20, 10, 57, 3), Value = 3235.0d };

val.Add(v1); val.Add(v2); val.Add(v3); val.Add(v4);
val.Add(v5); val.Add(v6); val.Add(v7); val.Add(v8);
val.Add(v9); val.Add(v10); val.Add(v11); val.Add(v12);

val.Add(g1); val.Add(g2); val.Add(g3); val.Add(g4);
val.Add(g5); val.Add(g6); val.Add(g7); val.Add(g8);
val.Add(g9); val.Add(g10); val.Add(g11); val.Add(g12);

我想通过计算每个参数的平均值从这三分钟的数据中获取每小时数据。例如,时间为 00:00、00:03、00:06、...、00:57 的数据,以计算 00 小时内参数 100 和 101 的平均值。实际上,val List 中的数据范围可能是几个小时或几天。

我怎样才能用好的代码正确地做到这一点?谢谢。

【问题讨论】:

  • 请把最后一部分写清楚一点好吗?很难说出你真正想要达到的目标。

标签: c# linq average


【解决方案1】:

类似这样的:

var valuesByHourQuery = from val in vals
                        group val by val.ParamId into valsByParam
                        select new
                        {
                            ParamId = valsByParam.Key,
                            AvarageValues = from v in valsByParam
                                            let timeStampWithoutMinutes = new DateTime(v.TimeStamp.Year, v.TimeStamp.Month, v.TimeStamp.Day, v.TimeStamp.Hour, 0, 0)
                                            group v by timeStampWithoutMinutes into valsByHours 
                                            select new
                                            {
                                                Hour = valsByHours.Key,
                                                Value = valsByHours.Average(v => v.Value)
                                            }
                        };

【讨论】:

  • 你的 LINQ 代码在 10 小时内的平均值是 357.166666666667,但正确的值是 358。哪里出错了? 10 小时值必须包括范围 00:00:00.000 到 23:59:59.000。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
  • 1970-01-01
相关资源
最近更新 更多