C# 如何使用Linq按日期时间和平均结果对词典进行分组
我有这个数据集C# 如何使用Linq按日期时间和平均结果对词典进行分组,c#,linq,dictionary,C#,Linq,Dictionary,我有这个数据集 var results=newdictionary() 结果类如下所示: public class Result { public decimal Temperature { get; set } public decimal DayTime { get; set; } } Dictionary Key Dictionary Value (Result class) -------------- ---------------------------
var results=newdictionary()
结果
类如下所示:
public class Result
{
public decimal Temperature { get; set }
public decimal DayTime { get; set; }
}
Dictionary Key Dictionary Value (Result class)
-------------- -------------------------------
01/01/2020 09:00 { Temperature: +9, DayTime: true }
01/01/2020 18:00 { Temperature: +5, DayTime: false}
01/02/2020 09:00 { Temperature: +8, DayTime: true }
01/02/2020 18:00 { Temperature: +3, DayTime: false }
01/2020 - DayTime Avg. Temp +9
01/2020 - NightTime Avg. Temp +5
02/2020 - DayTime Avg. Temp +8
02/2020 - NightTime Avg. Temp + 3
我的数据集将如下所示:
public class Result
{
public decimal Temperature { get; set }
public decimal DayTime { get; set; }
}
Dictionary Key Dictionary Value (Result class)
-------------- -------------------------------
01/01/2020 09:00 { Temperature: +9, DayTime: true }
01/01/2020 18:00 { Temperature: +5, DayTime: false}
01/02/2020 09:00 { Temperature: +8, DayTime: true }
01/02/2020 18:00 { Temperature: +3, DayTime: false }
01/2020 - DayTime Avg. Temp +9
01/2020 - NightTime Avg. Temp +5
02/2020 - DayTime Avg. Temp +8
02/2020 - NightTime Avg. Temp + 3
我的目标是计算每月白天和夜间的平均温度,得出如下结果:
public class Result
{
public decimal Temperature { get; set }
public decimal DayTime { get; set; }
}
Dictionary Key Dictionary Value (Result class)
-------------- -------------------------------
01/01/2020 09:00 { Temperature: +9, DayTime: true }
01/01/2020 18:00 { Temperature: +5, DayTime: false}
01/02/2020 09:00 { Temperature: +8, DayTime: true }
01/02/2020 18:00 { Temperature: +3, DayTime: false }
01/2020 - DayTime Avg. Temp +9
01/2020 - NightTime Avg. Temp +5
02/2020 - DayTime Avg. Temp +8
02/2020 - NightTime Avg. Temp + 3
注意,将有更多的数据点,因为我将有一年中每天每小时的数据
我已经开始在字典
类型上使用GroupBy()
方法,但我无法计算如何钻取每个结果,以便按昼夜进行分离并平均温度
这可以用Linq实现吗?或者我应该循环结果,使用Linq提取月度数据并对值进行平均?我可以得到一个明确的月份列表,然后循环选择日/夜值并执行平均值
如果有更简洁的方法可以做到这一点,我很乐意学习。在一个linq中做到这一点很有挑战性。你需要两组不均匀的9小时和15小时。因此,您按天分组,然后减去9小时以开始9:00AM,然后测试偏移是否小于9小时(上午9:00AM到下午6:00pm)或更大。我必须让温度接受空值,因为一个范围不能有温度。 请参阅下面的解决方案
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
TimeSpan SIX_PM = new TimeSpan(18, 0, 0); // Time from midnight to 6PM;
List<Result> input = new List<Result>() {
new Result() { DayTime = DateTime.Parse("10/28/20 2:00"), Temperature = 2},
new Result() { DayTime = DateTime.Parse("10/28/20 4:00"), Temperature = 3},
new Result() { DayTime = DateTime.Parse("10/28/20 6:00"), Temperature = 4},
new Result() { DayTime = DateTime.Parse("10/28/20 8:00"), Temperature = 5},
new Result() { DayTime = DateTime.Parse("10/28/20 10:00"), Temperature = 6},
new Result() { DayTime = DateTime.Parse("10/28/20 12:00"), Temperature = 7},
new Result() { DayTime = DateTime.Parse("10/28/20 14:00"), Temperature = 8},
new Result() { DayTime = DateTime.Parse("10/28/20 16:00"), Temperature = 9},
new Result() { DayTime = DateTime.Parse("10/28/20 18:00"), Temperature = 10},
new Result() { DayTime = DateTime.Parse("10/28/20 20:00"), Temperature = 11},
new Result() { DayTime = DateTime.Parse("10/28/20 22:00"), Temperature = 12},
new Result() { DayTime = DateTime.Parse("10/29/20 0:00"), Temperature = 13},
new Result() { DayTime = DateTime.Parse("10/29/20 2:00"), Temperature = 14},
new Result() { DayTime = DateTime.Parse("10/29/20 4:00"), Temperature = 15},
new Result() { DayTime = DateTime.Parse("10/29/20 6:00"), Temperature = 16},
new Result() { DayTime = DateTime.Parse("10/29/20 8:00"), Temperature = 17},
new Result() { DayTime = DateTime.Parse("10/29/20 10:00"), Temperature = 18},
new Result() { DayTime = DateTime.Parse("10/29/20 12:00"), Temperature = 19},
new Result() { DayTime = DateTime.Parse("10/29/20 14:00"), Temperature = 20},
new Result() { DayTime = DateTime.Parse("10/29/20 16:00"), Temperature = 21},
new Result() { DayTime = DateTime.Parse("10/29/20 18:00"), Temperature = 22},
new Result() { DayTime = DateTime.Parse("10/29/20 20:00"), Temperature = 23},
new Result() { DayTime = DateTime.Parse("10/29/20 22:00"), Temperature = 24}
};
Dictionary<DateTime, Result> results = input.GroupBy(x => x.DayTime, y => y)
.ToDictionary(x => x.Key, y => y.FirstOrDefault());
var data = results.GroupBy(x => x.Key.AddHours(-9).Date)
.SelectMany(x => Enumerable.Range(0, 2)
.Select(y => (y == 0)
? new
{
Date = x.Key.AddHours(9).ToString(),
AverageTemperature = x.Where(z => z.Key - x.Key < SIX_PM)
.Average(z => z.Value.Temperature),
DayTime = "DayTime"
}
: new
{
Date = x.Key.AddHours(18).ToString(),
AverageTemperature = x.Where(z => z.Key - x.Key >= SIX_PM)
.Average(z => z.Value.Temperature),
DayTime = "NightTime"
}
))
.Where(x => x.AverageTemperature != null)
.ToList();
}
public class Result
{
public decimal? Temperature { get; set; }
public DateTime DayTime { get; set; }
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
TimeSpan SIX_PM=新的TimeSpan(18,0,0);//从午夜到下午6点的时间;
列表输入=新列表(){
新结果(),
新结果(),
新结果(),
新结果(),
新结果(){day=DateTime.Parse(“10/28/20 10:00”),温度=6},
新结果(),
新结果(),
新结果(),
新结果(),
新结果(),
新结果(),
新结果(){day=DateTime.Parse(“10/29/20 0:00”),温度=13},
新结果(),
新结果(),
新结果(),
新结果(),
新结果(){day=DateTime.Parse(“10/29/20 10:00”),温度=18},
新结果(),
新结果(),
新结果(),
新结果(),
新结果(),
新结果()
};
Dictionary results=input.GroupBy(x=>x.day,y=>y)
.ToDictionary(x=>x.Key,y=>y.FirstOrDefault());
var data=results.GroupBy(x=>x.Key.AddHours(-9).Date)
.SelectMany(x=>Enumerable.Range(0,2)
.选择(y=>(y==0)
?新的
{
Date=x.Key.AddHours(9).ToString(),
平均温度=x,其中(z=>z.键-x.键<六点)
.平均值(z=>z.值温度),
日间=“日间”
}
:新
{
Date=x.Key.AddHours(18).ToString(),
平均温度=x.Where(z=>z.Key-x.Key>=6pm)
.平均值(z=>z.值温度),
日间=“夜间”
}
))
.其中(x=>x.AverageTemperature!=null)
.ToList();
}
公开课成绩
{
公共十进制?温度{get;set;}
公共日期时间白天{get;set;}
}
}
}
您只需嵌套您的GroupBy
即可处理每个分组:一个用于日期,另一个用于白天。我使用SelectMany
将子分组展平,但您可以保留它们
var ans = results.GroupBy(dr => dr.Key.Date, dr => dr.Value)
.SelectMany(rg => rg.GroupBy(r => r.DayTime, r => r.Temperature).Select(tg => new { Date = rg.Key, DayTime = tg.Key, AvgTemp = tg.Average() }))
.ToList();
你试过
OrderBy
方法吗?@RamonDias:OrderBy如何解决平均问题?结果的day
属性不应该是bool
?