0

別のシステムから 30 分間隔で次の時間データのシーケンスを期待しています。この 30 分のペアを 1 時間間隔で作成する必要があります。

例: ソース データ:

Start:7:00
End: 7:30
Start:7:30
End: 8:00
Start:8:00
End: 8:30
Start:8:30
End: 9:00

以下のように時間データに変換します。

Start:7:00
End: 8:00
Start:8:00
End: 9:00

30 分ブロックに一致するものがない場合、このレコードは無視する必要があります。

 Start:7:00
    End: 7:30
    Start:7:30
    End: 8:00
    Start:8:00
    End: 8:30
    Start:8:30
    End: 9:00
    Start:9:00 <-- Ignore this 
    End: 9:30  <-- Ignore this

誰かがこれを達成する方法を提案できますか?

4

1 に答える 1

0

私のソリューションの一般的なアイデアは、単にインデックスの要素のみを取得することです。

0、3、4、7、8、11、12、...

言い換えればindex % 4、0 または 3 の場合です。

それを行う前に、最後に残りの日付があるかどうかを で確認しcount % 4ます。ある場合は、それらをカットします。

これは、あなたが示した入力として日付がすべて有効であることを前提としています。

これが私の実装です:

public static IEnumerable<DateTime> CutTimes(IEnumerable<DateTime> source)
{
    var count = source.Count();
    var ignore = count % 4;

    if (ignore != 0)
    {
        source = source.Take(count - ignore);
    }

    return source.Where((time, index) => index % 4 == 0 || index % 4 == 3);
}

使用法:

var times = new[]
                {
                    new DateTime(2012, 5, 10, 7, 00, 0),
                    new DateTime(2012, 5, 10, 7, 30, 0),
                    new DateTime(2012, 5, 10, 7, 30, 0),
                    new DateTime(2012, 5, 10, 8, 00, 0),
                    new DateTime(2012, 5, 10, 8, 00, 0),
                    new DateTime(2012, 5, 10, 8, 30, 0),
                    new DateTime(2012, 5, 10, 8, 30, 0),
                    new DateTime(2012, 5, 10, 9, 00, 0),
                    new DateTime(2012, 5, 10, 9, 00, 0),
                    new DateTime(2012, 5, 10, 9, 30, 0)
                };

var result = CutTimes(times);

foreach (var time in result)
{
    Console.WriteLine(time);
}

出力:

2012/10/05 07:00:00

2012/10/05 08:00:00

2012/10/05 08:00:00

2012/10/05 09:00:00

于 2012-05-10T02:55:05.143 に答える