2016-03-31 5 views
1

私はDateTimeのSortedDictionaryを持っていて、_historicalValuesとdouble HistoricalValueというメソッドを持っていて、DateTime dateが渡されています。 HistoricalValueは、dateに最も近い_historicalValuesのDateTimeに対応するdoubleを返す必要があります。最も近いDateTimeを見つけるためにSortedDictionaryを利用できる良い方法はありますか?SortedDictionaryでDateTimeの一番近いDateTimeキーを見つけるには?

私のアプローチはSortedDictionaryをまったく活用しない方法であり、最初の日付の違いを評価するためにコレクション全体を繰り返し処理する必要があるため、このタスクにアプローチするより良い方法があると思います。

private readonly SortedDictionary<DateTime, double> _historicalValues;  

public double HistoricalValue(DateTime date) 
{ 
    if (_historicalValues.ContainsKey(date)) 
     return _historicalValues[date]; 

    var closestDate = _historicalValues.Keys.OrderBy(
      t => Math.Abs((t - date).Ticks)).First(); 
    return _historicalValues[closestDate]; 
} 
+0

?年、月、週ごとにすべてのものを切り刻む価値があるかもしれません。あなたと仕事をするためにはるかに小さなセットを与え、物事をスピードアップすることができます。 –

+0

ソートされた辞書は必要ありません。実際のペアと結果だけを使用しないためです。この場合、通常の辞書はうまく動作し、 'uint、double'や' long、double'のようにペアを格納してからdatetimeを対応するdatatypeに変換して保存したい場合は、 'date.ToBinary()'を使ってください。 – Bauss

+0

歴史的な日付の短いリストであれば、それらを反復するだけです。大きなセットを最適化したい場合は、ソートされたリスト/配列を持ち、バリエーションを使ってバイナリ検索を実行できます。また、ヒープ実装を作成(または検索)することもできます。あなたのfindは挿入を実行しますが(アイテムを挿入しません)、2つの隣接する値を見つける必要があります。 –

答えて

1

私はMinByがこの回答に記載された使用します。enter link description here

をし、このようにそれを使用します。離れてこれらの歴史的な値であり、どこまで

return _historicalValues.MinBy(kvp => Math.Abs((kvp.Key - date).Ticks)).Value; 
+0

R00st3rありがとう、私は似たような問題があり、これは本当に助けになりました! – Erik

1

あなたのSortedDictionarySortedList<DateTime, double>に変更することができます。

int indexOfPrevious = dictionary.IndexOfKey(knownKey) - 1; 

あなたの商品より< 0が最初で、以前持っていない場合:あなたが例:前のキーは次のようになります。2. から前後の値を取得し、最寄りのを選択するablleだろう。この場合 素子。

関連する問題