【问题标题】:What data structure should I use? HashTable, Array...?我应该使用什么数据结构?哈希表,数组...?
【发布时间】:2016-10-31 18:48:12
【问题描述】:

我必须永久(或至少在下次执行之前)保存如下表格:

|  ID  |  Color  |
|------|---------|
| 0001 |  Red    |
| 0002 |  Blue   |
| 0003 |  Green  |

我想在外部将它保存在 XML 文件中,但我不知道我应该在内部使用哪种数据结构来访问这些数据,因为我想要某种迭代元素,但可以快速且易于访问并保存到外部 XML 文件,如果我想添加新关系,ID 必须是 0004

我的意思是,我应该使用 Hashtable、DataTable、Array...吗?我应该改变导出这种关系的方式还是最好(简单快捷)的方式是将它们导出到 XML 文件中?

【问题讨论】:

  • 请注意,您用于存储元素集合的数据类型与您的运行时要求相关(至少性能、内存使用和使用模式 - 插入/删除/搜索速度)。当您使数据持久化时,您不必保持相同的结构(例如,哈希表可能只是存储大量节点集)。存储要求是另一回事,有不同的选择:您是否必须手动编辑该文件?将其用作交换格式?一定特别小吧?你必须处理版本控制吗?
  • 列表怎么样? id 可能只是列表索引。您实际需要对这些数据做什么、ID 的含义、您如何访问它等信息太少了。但它很可能是基于意见的。
  • ID 的事情可能有点棘手,因为您不能简单地使用集合中的项目数来知道下一个 ID(除非您禁止删除)。如何获取下一个 ID 可以像查询当前使用的 ID 一样简单(如果并发和速度/集合大小不是问题),否则您需要存储 next ID (或最新的 ID)。 ..) 某处(最终保持线程安全)
  • @AdrianoRepetti 数据将根据执行次数以对数方式增长以稳定(我计算在 100 以下)。我只需要和 ID 和一个字符串,所以文件中不需要大尺寸来保存它。我只想要一种快速简便的方法来修改和导入和导出数据。谢谢

标签: c# arrays xml data-structures hashtable


【解决方案1】:

由于泛型几乎没有理由再使用Hashtable。 将这些值存储在内存中的最佳方法是通用字典(请参阅:https://msdn.microsoft.com/en-us/library/xfhwa508(v=vs.110).aspx)。因此,假设您的“ID”是int,而您的“颜色”是string,请使用:Dictionary<int, string>。这些字典速度很快(O(1) 运算),而且它们不需要像 Hashtable 那样的任何类型转换。

要将其存储在文件中,有多种选择。您可以尝试将字典放在一个类中,并将整个类存储到一个 XML 文件中:

【讨论】:

    【解决方案2】:

    有多少数据?它会改变吗?如何访问数据?

    如果有数以百万计的行没有变化并且查找总是通过 id 进行,那么Dictionary<int, Color> 可能是最好的。

    如果有几十行,则由任一字段更新和访问一个自定义类型的简单数组(id 和颜色属性)进行简单的线性查找可能是最好的(不需要维护数据顺序节省的费用足以进行更昂贵的查找)。

    (在任何一种情况下,当您在内存中完成所有工作时,最好使用简单的持久性格式:在运行时提供您需要的灵活性。) 任何实际情况都会介于两者之间。最后,如果性能足够重要,您将尝试一种方法并进行衡量;然后另一种方式和措施。 (因此,隐藏内部细节的一点抽象是重要的起点。)重复直到满足您的性能要求。

    【讨论】:

    • 数据会根据执行次数呈对数增长以稳定(我计算在 100 以下)。我只需要和 ID 和一个字符串,所以文件中不需要大尺寸来保存它。我只想要一种快速简便的方法来修改和导入和导出数据。谢谢
    • @JoseMMartin 在这种规模下,几乎任何事情都会很快:您没有足够的数据来造成减速。
    【解决方案3】:

    如果您打算将记录转换为 XML,我认为您可以使用 DataTable。它有DataTable.WriteXml() 方法可以很好地完成你的工作。

    但如果您需要更快的访问和一些操作,请使用字典。至少访问速度比DataTable快很多。

    【讨论】:

      猜你喜欢
      • 2020-11-17
      • 2015-03-05
      • 2011-12-12
      • 2011-07-30
      • 1970-01-01
      • 2017-08-27
      • 2011-10-24
      • 1970-01-01
      相关资源
      最近更新 更多