.net 集合-为什么有这么多选项?

.net 集合-为什么有这么多选项?,.net,arrays,collections,list,.net,Arrays,Collections,List,我的大部分编程经验都是使用一种语言,其中有一个集合数据结构——数组。现在我主要在.NET中工作,我开始欣赏我可以使用的大量工具,但我也发现很难确定哪些工具最适合每个问题。我发现收藏中经常出现这种情况 我相信,凭借时间/经验,我将能够更快地找到适合这份工作的工具,但有人能提供一些指导,说明哪些收集课程适合哪些工作吗?有什么好的经验法则可以遵循吗 编辑:我发现我几乎总是使用List(T),这正是引发这个问题的原因。我知道使用其他类有非常具体的原因。虽然List(T)在大多数情况下都有效,但我希望避免

我的大部分编程经验都是使用一种语言,其中有一个集合数据结构——数组。现在我主要在.NET中工作,我开始欣赏我可以使用的大量工具,但我也发现很难确定哪些工具最适合每个问题。我发现收藏中经常出现这种情况

我相信,凭借时间/经验,我将能够更快地找到适合这份工作的工具,但有人能提供一些指导,说明哪些收集课程适合哪些工作吗?有什么好的经验法则可以遵循吗

编辑:我发现我几乎总是使用List(T),这正是引发这个问题的原因。我知道使用其他类有非常具体的原因。虽然List(T)在大多数情况下都有效,但我希望避免在另一种结构更适合的情况下将某些内容干扰到通用列表中。我必须能够发现这些病例


谢谢

你没有说你以前用过什么语言,但我很有信心地说,如果你认为数组是唯一可用的东西,那么你可能错了

例如,C++仅在本机上支持数组“collections”(“collections”),但通过添加指针,您可以为.Net中可用的任何集合数据结构实现等效的集合。事实上,如果您查看C++标准模板库,您将发现大多数常见结构的库存实现。 使用附加结构的原因是,数组并不总是,甚至不是最适合用于数据集合的结构。它有许多限制,可以通过一个集合或另一个集合来解决,使用这些不同的集合,您通常可以从更少的代码中获得更高的性能,并减少数据结构实现中出现错误的可能性

在决定使用哪种集合类型时,您需要了解它在大多数情况下是如何使用的。例如,集合中的所有对象都应该是同一类型、继承自同一类型还是任何类型?您是否将经常添加和删除项目?如果是这样,您会一直推送/弹出、排队/出列项目,还是需要将项目添加到特定位置?您会按键、索引或两者查找特定项吗?如果按键,如何确定键

一些更常见的收藏:

  • 列表
    可能应在您习惯使用数组的大多数情况下使用。它支持按索引查找,使用与数组相同的语法,性能接近数组,是强类型的,可以非常轻松地添加或删除项,并可以非常快速地追加或弹出项(插入到特定位置要慢得多)

  • LinkedList
    如果你接受过正式的计算机科学培训,听起来应该很熟悉。它使用与列表类似的语法,但优化方式不同:查找速度较慢,因为它们需要遍历列表,而将项目添加或删除到特定位置可能会快得多

  • 字典
    使用类似于
    列表
    的语法,但不使用数组索引,而是将键值放在括号中。字典是很棒的,因为按键查找特定项被认为是非常快的,因为无论字典中有多少项,找到所需项所需的时间总是相同的

  • SortedList
    的工作原理与字典非常相似,只是当您对其进行迭代时,返回的项目按键排序。但是,如果不先迭代第n个项之前的所有项,则无法查找该项

  • KeyedCollection
    经常被忽略,因为它隐藏在与其他一些集合不同的命名空间中,并且您必须实现一个(非常简单的)函数来使用它。它的工作原理也很像字典,另外它还支持按索引轻松查找。当项的键是项本身的简单属性时,通常使用它

  • 不要忘记旧的备用项:
    Stack
    Queue
    。同样,如果你有任何正式的计算机科学教育,你应该已经有了一个相当好的想法,根据他们的名字如何工作

最后,这些集合中的大多数(包括数组!)都实现了一组公共接口。这些接口非常有用,因为您可以针对接口而不是特定集合编写程序,然后您的函数可以接受实现该接口的任何集合。例如,无论您传入字符串数组、
列表
,还是任何其他
IEnumerable
,以下代码都将起作用:

void writeConsole(IEnumerable项)
{
foreach(项中的字符串项)
{
控制台写入线(项目);
}
}

其他值得一看的界面包括
IList
ICollection
IQueryable
堆栈、队列、分类列表、字典、哈希表等集合都是标准数据结构,在各种情况下都很方便

队列支持FIFO实现,而无需您自己完成。堆栈给你后进先出。SortedList会给你一个预先分类的列表等等

集合名称空间中还有许多其他名称空间,所有名称空间都进行了讨论。

通用列表(List)非常适合通用。他们不进行装箱和拆箱。所以没有表演方面的问题

List<string> items = new List<string>();
items.Add("abc");
items.Add("dfg");
分类列表哈希表是存储键值对。您可以为项目定义一个键。这有助于您快速找到它们。SortedList是自动对表进行排序的

Hashtable items1 = new Hashtable();
items1.Add("item1", "abc");
items1.Add("item2", "dfg");

SortedList items2 = new SortedList();
items2.Add("Second", "dfg");
items2.Add("First", "abc");
希望这有帮助

我可以提供两个建议: 1.尽可能多地使用通用集合。
ArrayList items = new ArrayList();
items.Add("abc");
items.Add(1);
items.Add(DateTime.Now);
Hashtable items1 = new Hashtable();
items1.Add("item1", "abc");
items1.Add("item2", "dfg");

SortedList items2 = new SortedList();
items2.Add("Second", "dfg");
items2.Add("First", "abc");