C# LINQ查询的建议

C# LINQ查询的建议,c#,linq,average,C#,Linq,Average,我有以下用于在列表中存储数据的类: 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 d

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

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);
IList val=new List();
//2011年12月12日10小时
值v1=新值{ParamId=100,时间戳=新日期时间(2011,12,20,10,0,0),值=345.0d};
值v2=新值{ParamId=100,TimeStamp=newdatetime(2011,12,20,10,0,1),值=350.0d};
值v3=新值{ParamId=100,TimeStamp=newdatetime(2011,12,20,10,0,2),值=355.0d};
值v4=新值{ParamId=100,时间戳=新日期时间(2011,12,20,10,0,3),值=344.0d};
值g1=新值{ParamId=101,TimeStamp=newdatetime(2011,12,20,10,0,0),值=3000.0d};
值g2=新值{ParamId=101,TimeStamp=newdatetime(2011,12,20,10,0,1),值=3100.0d};
值g3=新值{ParamId=101,TimeStamp=newdatetime(2011,12,20,10,0,2),值=3150.0d};
值g4=新值{ParamId=101,TimeStamp=newdatetime(2011,12,20,10,0,3),值=3125.0d};
值v5=新值{ParamId=100,TimeStamp=newdatetime(2011,12,20,10,3,0),值=355.0d};
值v6=新值{ParamId=100,TimeStamp=newdatetime(2011,12,20,10,3,1),值=360.0d};
值v7=新值{ParamId=100,TimeStamp=newdatetime(2011,12,20,10,3,2),值=365.0d};
值v8=新值{ParamId=100,时间戳=新日期时间(2011,12,20,10,3,3),值=360.0d};
值g5=新值{ParamId=101,TimeStamp=newdatetime(2011,12,20,10,3,0),值=3150.0d};
值g6=新值{ParamId=101,TimeStamp=newdatetime(2011,12,20,10,3,1),值=3200.0d};
值g7=新值{ParamId=101,TimeStamp=newdatetime(2011,12,20,10,3,2),值=3250.0d};
值g8=新值{ParamId=101,TimeStamp=newdatetime(2011,12,20,10,3,3),值=3225.0d};
//............... 最多57分钟
值v9=新值{ParamId=100,TimeStamp=newdatetime(2011,12,20,10,57,0),值=350.0d};
值v10=新值{ParamId=100,TimeStamp=newdatetime(2011,12,20,10,57,1),值=365.0d};
值v11=新值{ParamId=100,TimeStamp=newdatetime(2011,12,20,10,57,2),值=367.0d};
值v12=新值{ParamId=100,时间戳=新日期时间(2011,12,20,10,57,3),值=370.0d};
值g9=新值{ParamId=101,TimeStamp=newdatetime(2011,12,20,10,57,0),值=3250.0d};
值g10=新值{ParamId=101,TimeStamp=newdatetime(2011,12,20,10,57,1),值=3240.0d};
值g11=新值{ParamId=101,TimeStamp=newdatetime(2011,12,20,10,57,2),值=3200.0d};
值g12=新值{ParamId=101,TimeStamp=newdatetime(2011,12,20,10,57,3),值=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列表中的数据范围可能只有几个小时或几天

如何使用良好的代码正确地执行此操作?谢谢。

诸如此类:

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)
                                            }
                        };
大概是这样的:

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.166667,但正确的值为358。错误在哪里?10小时值必须包括从00:00:00.000到23:59:59.000的范围。谢谢。对于你的LINQ代码,10小时内的平均值是357.166667,但正确的值是358。错误在哪里?10小时值必须包括从00:00:00.000到23:59:59.000的范围。谢谢