我希望按时间步长(小时,天,周等)对我的列表进行分组,并计算每个组的总和,但是从特定时间开始。
现在我有了输入列表:
TIME VALUE
11:30 2
11:50 2
12:00 6
12:30 10
12:50 2
和小时步骤
var timeStep=new TimeSpan(1,0,0);
我正在将我的列表分组为
var myList = list.GroupBy(x =>
{
return x.Time.Ticks / timeStep.Ticks;
})
.Select(g => new { Time = new DateTime(g.Key * timeStep.Ticks), Value = g.Sum(x => x.Value) }).ToList();
它工作正常(也适用于任何其他步骤,例如每天,每周)并给出结果:
TIME SUM
11:00 4
12:00 18
但是现在我必须按小时步骤对我的列表进行分组,但是从例如30分钟的小时,所以我能做些什么来做这件事:
TIME SUM
11:30 10
12:30 12
答案 0 :(得分:2)
最好使用自定义DateTime比较:
internal class DateTimeComparer : IEqualityComparer<DateTime>
{
public bool Equals(DateTime x, DateTime y)
{
return GetHashCode(x) == GetHashCode(y);
// In general, this shouldn't be written (because GetHashCode(x) can equal GetHashCode(y) even if x != y (with the given comparer)).
// But here, we have: x == y <=> GetHashCode(x) == GetHashCode(y)
}
public int GetHashCode(DateTime obj)
{
return (int)((obj - new TimeSpan(0, 30, 0)).Ticks / new TimeSpan(1, 0, 0).Ticks);
}
}
使用:
var myList = list.GroupBy(x => x.Time, new DateTimeComparer())
.Select(g => new { Time = g.Key, Value = g.Sum(x => x.Value) }).ToList();