【问题标题】:How to store a group of data with 2 different search parameters?如何使用 2 个不同的搜索参数存储一组数据?
【发布时间】:2013-10-03 18:52:19
【问题描述】:

我有一个类包含与此问题相关的以下数据(Xpos、Ypos、时间戳)

大小为 100x100 区域(Xpos 和 Ypos),每个位置都有一个更新时间,即时间戳,然后为该类赋予一个新的时间戳以进行下一次更新。

现在我可以遍历所有这些数据点并找到时间戳已启动的任何类,并执行所需的操作。在我看来,这似乎是低效的。

替代方案我可以将它存储在一个排序列表中,时间戳是决定者,所以我只需要检查直到我发现一个尚未准备好更新的条目,更新它们并使用新的时间戳删除/读取它们。

现在我的问题是,可以通过通过 Xpos 和 Ypos 找到位置的工作流来修改预期的下一个时间戳,这意味着我必须再次遍历所有条目才能执行此操作。

我可以通过排序列表和 100x100 数组中的对象来解决这个问题,问题是通过 100x100 数组列表更新时间戳,不会更新其在排序列表中的位置。

有没有一种很好的方法来处理这种“双重排序”,而不必从时间戳触发点或从时间戳的数组更新中遍历完整列表。

【问题讨论】:

  • 我正在考虑添加一个额外的类,其中包含时间和指向对象的链接,而对象包含指向此的链接。在排序列表中使用此对象。如果时间戳是从 Xpos、Ypos 引用更新的,它只是将它自己在此引用类中的链接设为空,并在列表中创建一个新条目。这将提供快速忽略的排序空链接对象。

标签: c# list


【解决方案1】:

一种选择是将您的数据存储在priority queue 中。 C5 Collection LibraryIntervalHeap 将是一个不错的选择。 IntervalHeap<T>.Replace 方法允许您直接替换项目(即:更改其优先级,即Timestamp)。

【讨论】:

  • 当我更新时间戳以更新队列中的对象位置时,我没有遵循这对我有什么帮助。
  • @Taoh 您可以根据时间戳创建比较器。优先级队列将自动对项目进行排序,并根据您的优先级(时间戳)将它们保持在队列中。
  • 我根本不明白这一点......如果我更新优先级队列中对象的时间戳并为其提供新时间戳,它只会更新其位置而无需通知队列更新发生了吗?
  • @Taoh 你需要使用Replace 方法通知它更新。这就是为什么我在那里提到它。 (它只是比使用删除/添加更有效)
  • 所以如果 Storage 对象中的“更新”函数有对列表的引用,我会更新时间戳,然后执行 list.Replace(this, timestamp) ...?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
  • 2012-05-03
  • 2022-11-22
  • 2010-12-01
  • 2022-01-12
  • 1970-01-01
  • 2011-09-30
相关资源
最近更新 更多