c# - 在 Dictionary<DateTime, double> 中查找最接近的 DateTime 键

标签 c# linq datetime dictionary collections

我有 Date DateTime 的一部分作为查找值,并喜欢在 Dictionary<DateTime, double> 类型的字典中检索匹配值.请注意,日期时间键仅存储为日期部分。

我的问题是可能没有与我的查找值匹配的键。然后我想做的是找到最近的 previous dateTime.Date 键和匹配值。

现在,我知道字典不是按键排序的。我可以使用 SortedDictionary,但出于特定原因更喜欢使用 Dictionary,或者切换到 List 集合(可以预先排序)。我的问题是,在这种情况下您会建议做什么:保留 Dictionary 结构并递减查找值直到找到匹配的键是否更有效?或者使用列表集合并使用 Linq 会更好吗?每个字典包含大约 5000 个键/值对。另外,请注意我正在寻找一个计算效率很高的解决方案,因为查找的频率非常高(可能有几十万次(每次查找都保证与以前的任何值不同)

最佳答案

因为你需要它很快,我认为最好的办法是使用 BinarySearch 的结果。 .这需要 List<T>这是排序。

int result = myList.BinarySearch(targetDate);
if (result >= 0)
    return myList[result];
else
{
    int nextLarger = ~result;
    // return next smaller, or if that doesn't exist, the smallest one
    return myList[Math.Max(0, nextLarger - 1)];
}

应该可以创建一个结合 Dictionary<TKey,TValue> 的类和一个排序的 List<TKey>仍然像 Dictionary<TKey,TValue> 一样序列化.序列化可能就像放置一个 [JsonConverter(typeof(KeyValuePairConverter))] 一样简单(在 Json.NET 中)在你的课上。

只是为了完整起见,以防将来其他人阅读这篇文章,如果速度不是很重要,你可以用这样的东西更简单地做到这一点:

var result = myDict.Keys.Where(x => x < targetDate).Max();

关于c# - 在 Dictionary<DateTime, double> 中查找最接近的 DateTime 键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23632926/

相关文章:

c# - Entity Framework 的多个条件以获得所需的记录

php - 行之间的时间差

datetime - 如何将包含日期和时区的字符串解析为DateTime

c# - 全选文本框文本

c# - 总和和分组依据

C# 从一个位置跳到另一个位置

c# - LINQ to JSON - 查询对象或数组

java - 无法使用季度从 TemporalAccessor 获取 LocalDate

c# - Xamarin 安卓 : Cannot use ActionBarActivity

c# - 将字符串从 C++/CLI 类库传递到 C#