1

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

现在我有输入列表:

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
4

1 回答 1

2

最好使用自定义 DateTme 比较器:

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();
于 2013-01-28T09:48:06.933 回答