.NET - System.Collections.Immutable中是否存在单链接列表?

时间:2017-11-01 23:38:56

标签: c# .net list linked-list immutability

在函数式编程中,单链表非常流行,因为很容易重用子列表而无需分配任何内存或复制值。这意味着您可以在不进行任何分配的情况下从一端添加或删除项目。 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>是最好的选择吗?

1 个答案:

答案 0 :(得分:0)

在撰写本文时,.NET基类库中对此没有很好的答案。

System.Collections.Immutable中最接近的事物是ImmutableStack<T>,它被实现为引擎盖下的单链接列表。但是,公开的功能非常有限,因此除非您实际需要堆栈,否则这可能是一个糟糕的选择。您是正确的ImmutableList<T>是具有不同操作和性能特征的不同数据结构。

F#标准库中有FSharpList<T>,但是由于它是F#原语,因此在C#中使用起来很尴尬(有可能,它不会产生干净的惯用代码)。还需要将完整的F#标准库作为依赖项。

在我的一个项目中遇到了同样的问题,为此我写了一个NuGet package“ ImmutableLinkedList”(github here),因此也可以选择。