在函数式编程中,单链表非常流行,因为它很容易重用子列表,而无需分配任何内存或复制值。这意味着您可以在没有任何分配的情况下从一端添加或删除项目。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>是最好的选择吗?
发布于 2019-11-17 02:33:31
(在撰写本文时),在.NET基类库中还没有一个很好的答案。
System.Collections.Immutable中最接近的是ImmutableStack<T>,它被实现为幕后的单链表。但是,公开的函数非常有限,所以除非您真的想要一个堆栈,否则这可能是一个糟糕的选择。您说得对,ImmutableList<T>是一个不同的数据结构,具有不同的操作和性能特征。
在F#标准库中有FSharpList<T>,但是由于它是一个F#原语,在C#中使用起来很笨拙(这是可能的,只是不会产生干净、惯用的代码)。还需要将完整的F#标准库作为依赖项。
在我的一个项目中遇到了同样的问题,我为此写了一个NuGet package "ImmutableLinkedList“(github here),所以这也可以是一种选择。
https://stackoverflow.com/questions/47065319
复制相似问题