我的大部分编程经验都是使用一种语言,其中有一个集合数据结构 - 一个数组.现在我主要在.NET工作,我开始欣赏可用的大量工具,但我也发现很难确定哪种工具最适合每个问题.我发现这通常是收藏品的情况.
我确信我能够通过时间/经验更快地找到适合工作的合适工具,但是任何人都可以提供一些关于哪些收集类适合哪些工作的指导?有任何好的经验法则可以遵循吗?
编辑:我发现我几乎总是使用List(T),这就是提出这个问题的原因.我知道使用其他类有非常具体的原因.尽管List(T)工作时间最多,但我希望避免在其他结构更适合时将某些东西堵塞到通用列表中.我必须能够发现这些案件.
谢谢!
你之前没有说过你用过的语言,但是我觉得如果你相信阵列是唯一可用的,那么你可能会错了.
例如,C++本身仅支持数组"集合"(这里非常松散地使用"集合"),但是通过添加指针,您可以为.Net中可用的任何集合数据结构实现等效.实际上,如果你查看C++标准模板库,你会发现大多数常见结构的库存实现.
附加结构的原因是数组并不总是或者甚至经常是用于数据集合的最合适的结构.它有许多限制,可以通过一个或另一个集合来解决,使用这些不同的集合,您通常可以从更少的代码中获得更高的性能,并减少数据结构实现中存在错误的可能性.
在决定使用什么样的集合类型,你需要看它如何被使用最奥芬.例如,集合中的所有对象是否应该是相同类型,继承自相同类型或任何类型?您是否经常添加和删除项目?如果是这样,您是否总是推送/弹出,排队/出列项目或是否需要将项目添加到特定位置?您会按键,索引还是两者查找特定项目?如果按键,键是如何确定的?
一些更常见的集合:
List
应该在大多数习惯使用数组的情况下使用.它支持使用与数组相同的语法查找索引,其性能接近于数组,是强类型的,并且可以非常轻松地添加或删除项目,并且非常快速地追加或弹出项目(插入到特定位置是慢得多.
LinkedList
如果你做过任何正式的计算机科学培训,你应该听起来很熟悉.它使用类似于List的语法,但进行了不同的优化:查找速度较慢,因为它们需要遍历列表,而向特定位置添加或删除项目可以更快.
Dictionary
使用类似于a的语法List
,但不是数组索引,而是将键值放在括号中.字典很棒,因为按键查找特定项目的速度非常快,因为无论字典中有多少项目,它们总是花费大约相同的时间来查找所需的项目.
SortedList
它的工作方式与字典类似,但有一点例外,当你遍历它时,按键排序的项目将被返回.但是,如果没有先迭代所有项目,则无法查找第n个项目.
KeyedCollection
经常被忽略,因为它隐藏在与其他一些集合不同的命名空间中,你必须实现一个(非常简单的)函数来使用它.它也像字典一样工作,另外它支持通过索引轻松查找.它通常在项目的键是项目本身的简单属性时使用.
不要忘记旧的备用品:Stack
和Queue
.同样,如果你有任何正式的计算机科学教育,你应该已经很清楚这些工作是如何根据他们的名字进行的.
最后,大多数这些集合(包括数组!)实现了一组通用接口.这些接口非常有用,因为您可以针对接口而不是特定集合编写程序,然后您的函数可以接受实现该接口的任何集合.例如,无论您是传入字符串数组List
,还是传递任何其他代码,以下代码都将起作用IEnumerable
:
void WriteToConsole(IEnumerableitems) { foreach (string item in items) { Console.WriteLine(item); } }
值得看的其他接口包括IList
,ICollection
,和IQueryable
.