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