C# - TimeSpan从特定起点开始的组列表

时间:2013-01-28 09:37:09

标签: c# linq list grouping timespan

我希望按时间步长(小时,天,周等)对我的列表进行分组,并计算每个组的总和,但是从特定时间开始。

现在我有了输入列表:

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

1 个答案:

答案 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();