在函数式编程中,单链表非常受欢迎,因为它很容易重用子列表,而无需分配任何内存或复制值。这意味着您可以从一端添加或删除项,而无需任何分配。F#列表是这样的。
从我所读到的内容来看,System.Collections.Immutable.ImmutableList<T>
听起来像是System.Collections.Generic.List<T>
的不可变版本,System.Collections.Generic.List<T>
是对数组的抽象。这比链表更适合随机访问,但在添加或删除项时需要复制整个列表。System.Collections.Generic.LinkedList<T>
是一个可变的双向链表,这意味着添加或删除项需要进行突变和/或复制。
我找不到System.Collections.Immutable.ImmutableLinkedList<T>
。
在System.Collections.Immutable
包中真的没有不可变的单链表吗?使用Microsoft.FSharp.Core.List<T>
是最好的选择吗?
1条答案
按热度按时间apeeds0o1#
在编写本文时,.NET基类库中没有很好的答案。
System.Collections.Immutable
中最接近的东西是ImmutableStack<T>
,它在后台实现为单链表。然而,公开的函数非常有限,所以除非你真的想要一个堆栈,否则这可能是一个糟糕的选择。你是对的,ImmutableList<T>
是一个不同的数据结构,具有不同的操作和性能特征。在F#标准库中有
FSharpList<T>
,但由于是F#原语,在C#中使用它会很尴尬(这是可能的,它只是不会产生干净,惯用的代码)。还需要将完整的F#标准库作为依赖项。在我的一个项目中遇到了同样的问题,我为此编写了一个NuGet package“ImmutableLinkedList”(github here),所以这也是一个选择。