1

順序付けられたDateTime値のコレクションがあります。特定の開始時間と終了時間の間のコレクション内のすべての値を取得したいと考えています。最も効率的な方法でこれを行うには、どのコレクションを使用する必要がありますか?

4

2 に答える 2

2

使用できますList<T>が、注文したままにしてください。BinarySearchメソッドを使用して、リスト内で開始点を見つけますDateTime。次を返すことに注意してください。

アイテムが見つかった場合、ソートされたリスト内のアイテムのゼロベースのインデックス。それ以外の場合は、アイテムよりも大きい次の要素のインデックスのビット単位の補数である負の数、または大きい要素がない場合は、カウントのビット単位の補数です。

したがって、値が負の場合は、ビット単位の補数(~演算子)を適用して、範囲内にある最初のインデックスを見つける必要があります。次に、同じプロセスを使用して1を減算し、範囲内の最後の要素を見つけることができます。

于 2013-03-07T11:19:21.907 に答える
0

LINQを使用すると(これはタグの1つであるため)、次のように実行できます。

IEnumerable<DateTime> orderedDateTimes; // Your ordered DateTime collection
DateTime start;     // The start date/time, inclusive
DateTime end;       // The end date/time, inclusive

var range = orderedDateTimes
            .SkipWhile(dt => dt < start)
            .TakeWhile(dt => dt <= end);

これは、範囲を取得するためにO(n)の最悪の場合を取ります。ただし、結果をリストまたは配列に強制して、効率的に再利用できるようにすることができます。

DateTime[] rangeArray = range.ToArray();
// -or-
List<DateTime> rangeList = range.ToList();
于 2013-03-07T11:27:25.757 に答える