我有 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/