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 に答える