Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该使用什么数据结构?哈希表,数组。。。?_C#_Arrays_Xml_Data Structures_Hashtable - Fatal编程技术网

C# 我应该使用什么数据结构?哈希表,数组。。。?

C# 我应该使用什么数据结构?哈希表,数组。。。?,c#,arrays,xml,data-structures,hashtable,C#,Arrays,Xml,Data Structures,Hashtable,我必须永久(或至少在下次执行之前)保存一个如下表: | ID | Color | |------|---------| | 0001 | Red | | 0002 | Blue | | 0003 | Green | 我想在外部将其保存到XML文件中,但我不知道应该在内部使用哪种数据结构来访问这些数据,因为我需要某种迭代元素,但要快速方便地访问并保存到外部XML文件中,如果我想添加新的关系,ID必须是0004 我的意思是,我应该使用哈希表,数据表,数组。。。?我应该改变

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

|  ID  |  Color  |
|------|---------|
| 0001 |  Red    |
| 0002 |  Blue   |
| 0003 |  Green  |
我想在外部将其保存到XML文件中,但我不知道应该在内部使用哪种数据结构来访问这些数据,因为我需要某种迭代元素,但要快速方便地访问并保存到外部XML文件中,如果我想添加新的关系,ID必须是
0004


我的意思是,我应该使用哈希表,数据表,数组。。。?我应该改变导出这种关系的方式,还是最好(简单而快速)的方式是将它们导出到XML文件中?

由于泛型,几乎没有理由再使用
哈希表了。
将这些值存储在内存中的最佳方法是通用字典(请参阅:)。因此,假设您的“ID”是一个
int
,您的“Color”是一个
字符串
,请使用:
字典
。这些字典是快速的(O(1)-操作),并且它们不需要像
哈希表那样进行任何类型转换

要将其存储在文件中,有多个选项。您可以尝试将字典放入类中,并使用以下命令将整个类存储到XML文件中:

  • XmlSerializer
    (请参阅:)
  • DataContractSerializer
    (请参阅:)

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


但如果您需要更快的访问和一些操作,可以使用字典。至少在访问方面,它比DataTable快得多。

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

如果有数以百万计的行不变,并且总是按id进行查找,那么
字典可能是最好的

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

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

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