Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.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# 为什么SortedList和List使用数组,而LinkedList使用不多?_C#_List_Linked List_Sortedlist - Fatal编程技术网

C# 为什么SortedList和List使用数组,而LinkedList使用不多?

C# 为什么SortedList和List使用数组,而LinkedList使用不多?,c#,list,linked-list,sortedlist,C#,List,Linked List,Sortedlist,在我看来,列表基本上是使用链接列表实现的,而普通的数组是作为连续块实现的。我总是使用List,因为它位于Generic命名空间中,而且我认为它使用了动态内存分配,但我错了 昨天我看到了使用Reflector实现的List,发现它实际上是一个T数组(T[])。有很多数组。在操作列表中的每个元素时,复制。例如,当您使用Insert时,它将创建一个新内存并复制插入元素之前/之后的所有元素。所以在我看来,使用List是非常昂贵的 我也看到了分类列表。我不知道为什么SortedList也在其中实现了一个数

在我看来,
列表
基本上是使用
链接列表
实现的,而普通的
数组
是作为连续块实现的。我总是使用
List
,因为它位于
Generic
命名空间中,而且我认为它使用了动态内存分配,但我错了

昨天我看到了使用Reflector实现的
List
,发现它实际上是一个T数组(
T[]
)。有很多
数组。在操作
列表中的每个元素时,复制
。例如,当您使用
Insert
时,它将创建一个新内存并复制插入元素之前/之后的所有元素。所以在我看来,使用
List
是非常昂贵的

我也看到了分类列表。我不知道为什么
SortedList
也在其中实现了一个数组。您不认为每次对
列表
进行轻微操作时都需要对列表进行排序,因此使用数组将非常可怕吗


我还想知道为什么
List
如此受欢迎,因为大多数人使用它而不是
LinkedList
。这仅仅是因为索引器的灵活性吗?

因为大多数集合不需要经常在中间插入。但它们确实需要通过索引器直接访问。

在现实生活中,列表不调用数组。经常复制,通常只将项目附加到数组中,而不是插入。这是列表的目的,与链表不同。你只需要选择一个合适的集合类

如果插入项目,通常使用链表。如果您主要添加项目并且需要有效地迭代它们,请使用列表。

是的,对于插入,SortedList为O(n)。小心使用

最大的原因是现代计算机设计。CPU缓存非常重要,因为RAM非常慢。内存总线设计无法跟上CPU时钟速度的快速发展。使高频数字信号传播超过一英寸是非常困难的


数组具有无与伦比的缓存性能,当您迭代它时,很可能下一个元素已经在缓存中。链表给出的可能性很小,即这种情况下,下一项基本上是在一个随机地址。这很昂贵,它会使处理器暂停,等待RAM赶上。可以是数百个周期。

如果您想要一个单一类型的内存中集合,则:

  • 该集合必须是可增长的
  • 最常见的变异操作是将项追加到集合的末尾
  • 通过索引进行快速检索至关重要

  • 那么
    List
    可能是您的最佳选择<当(2)和(3)不适用时,代码>链接列表
    可能是更好的选择

    仔细查看:列表不会创建新数组并复制每次调用的所有项。阵列仅在满时才调整大小,并将其调整为原始大小的两倍。只有在不断添加项目时,才会以指数增长的间隔调整大小。这个问题没有正确的答案。考虑要么更具体,要么标记为wiki@dtb是,它使用此项。_items[此。_size++]=item;是的,它以指数方式增加间隔,但它如何始终确保size++有一个空的空间呢?是的,SortedList在我看来确实很昂贵。我想我从你那里得到了答案。所以重点是:Array=>很好,因为下一个元素立即可用,从而减少了CPU的工作量。LinkedList=>在中间插入时很好,我也不经常需要。SortedList=>非常昂贵,应该避免。+1非常好的观点/解释。别忘了,如果你需要下一个:)@abhishek:SortedList有一个不同的目的,你就必须访问上一个元素地址,那么你的速度会更慢。这是一个关联集合(键值),它按键排序,并且具有相当快的O(logn)键查找。而且,
    列表
    更易于使用和理解。