2016-03-31 4 views
1

Ich habe ein SortedDictionary von DateTime und Doppel _historicalValues, und eine Methode HistoricalValue, die eine DateTime date übergeben wird. HistoricalValue muss das entsprechende Double für die DateTime in _historicalValues zurückgeben, die date am nächsten ist. Gibt es einen schönen Weg, auf dem ich ein SortedDictionary nutzen kann, um die nächste DateTime zu finden?So finden Sie die nächstgelegenen DateTime-Schlüssel von DateTime in SortedDictionary?

Ich denke, es gibt eine bessere Möglichkeit, diese Aufgabe anzugehen, da mein Ansatz etwas ist, das kein SortedDictionary nutzt und mühsam über die gesamte Sammlung iterieren muss, um zuerst die Datumsunterschiede zu bewerten.

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

Wie weit auseinander diese historischen Werte sind? Könnte es wert sein, die ganze Sache bis zum Jahr, dann Monat, dann Woche zu zerhacken. Gibt Ihnen einen viel kleineren Satz zum Arbeiten und könnte die Dinge beschleunigen. –

+0

Sie brauchen kein sortiertes Wörterbuch, weil Sie nicht die tatsächlichen Paare und nur das Ergebnis verwenden. Ein reguläres Wörterbuch würde in diesem Fall gut funktionieren und wenn Sie es weniger speichern möchten, speichern Sie das Paar wie 'uint, double' oder' long, double' und konvertieren Sie dann einfach datetime in den entsprechenden Datentyp ex. mit 'date.ToBinary()'. – Bauss

+0

Wenn es sich um eine kurze Liste historischer Daten handelt, iterieren Sie sie einfach. Wenn Sie für große Mengen optimieren möchten, können Sie eine sortierte Liste/ein Array erstellen und eine binäre Suche mit einer Variation durchführen. Alternativ können Sie wahrscheinlich eine Heap-Implementierung erstellen (oder finden). Ihr Fund sollte eine Einfügung durchführen (aber den Gegenstand nicht einfügen) und die zwei benachbarten Werte finden. –

Antwort

1

ich die MinBy verwenden würde in dieser Antwort erwähnt: enter link description here

Und dann verwenden Sie es wie folgt aus:

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

Vielen Dank R00st3r, ich hatte ein ähnliches Problem, und das hat mir sehr geholfen! – Erik

1

Sie können Ihre SortedDictionary-SortedList<DateTime, double> ändern. In diesem Fall werden Sie ablle sein vorherige und nächste Werte zu erhalten und die nächste vom 2. Eg vorherigen Schlüssel wählen würde:

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

Wenn < 0 als Ihre Artikel zuerst und haben keine vorherige Element.

Verwandte Themen