[c#]按小时与 linq 数据进行分组并添加下一个日期

标签: Linq C#
发布时间: 2017/2/28 22:36:24
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我看起来像这样的列表中有一些数据︰

Date , Value
10:00 , 10
10:15 , 25
10:30 , 68
10:45 , 78
11:00 , 33
11:15 , 44
11:30 , 52
11:45 , 19
12:00 , 20
12:15 , 61

现在我想将它们分组像这样︰

10:15 , 25
10:30 , 68
10:45 , 78
11:00 , 33

11:15 , 44
11:30 , 52
11:45 , 19
12:00 , 20

很明显,我不能简单地使用由 Date.Hour 组。所以我以告终︰

for (int z = 1; z < list.Count(); z = z + 4)
{
list.Skip(z).Take(4);

// more code

}

但有时,1 季度的小时是在我的数据丢失。因此,所有我分组的数据现在是错误的因为每个分组转移由 15 分钟。

所以,我该怎么办我的数据进行分组正确?

谢谢你

解决方法 1:

你为什么不能按小时分组?你只需要包括的日期︰

var hourGroups = list.Select(x => new
{
    Element = x,
    Day = x.Date.Date,
    Hour = x.Date.AddMilliseconds(-1).Hour
})
 .GroupBy(x => new{ x.Day, x.Hour });

我已经减去一毫秒来获得你奇怪的分组。

与你的样品数据的一部分进行测试︰

var list = new List<Element>() { 
    new Element{Date=new DateTime(2014, 11, 18, 10, 00, 00), Value=10},
    new Element{Date=new DateTime(2014, 11, 18, 10, 15, 00), Value=25},
    new Element{Date=new DateTime(2014, 11, 18, 10, 30, 00), Value=68},
    new Element{Date=new DateTime(2014, 11, 18, 10, 45, 00), Value=78},
    new Element{Date=new DateTime(2014, 11, 18, 11, 00, 00), Value=33},
    new Element{Date=new DateTime(2014, 11, 18, 11, 15, 00), Value=44},
    new Element{Date=new DateTime(2014, 11, 18, 11, 30, 00), Value=52},
};

foreach(var grp in hourGroups)
    Console.WriteLine("Day:{0} Time:{1} Values:{2}",
        grp.Key.Day, grp.Key.Hour, string.Join(",", grp.Select(x => x.Element.Value)));

Output:
Day:18.11.20140 Time:9  Values:10
Day:18.11.2014  Time:10 Values:25,68,78,33
Day:18.11.20140 Time:11 Values:44,52

正如你所看到的与 10 上午的第一个元素属于 9 小时组似乎不理想。

如果你想要 List<Element> 为每个组︰

List<List<Element>> hourGroups = list.Select(x => new
{
    Element = x,
    Day = x.Date.Date,
    Hour = x.Date.AddMilliseconds(-1).Hour
})
 .GroupBy(x => new{ x.Day, x.Hour })
 .Select(g => g.Select(x => x.Element).ToList())
 .ToList();
赞助商