Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Linq按日期时间和平均结果对词典进行分组_C#_Linq_Dictionary - Fatal编程技术网

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