Jam*_*aix 5 .net c# linked-list 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>在这里使用最好的选择吗?
(截至撰写本文时).NET 基类库中对此没有很好的答案。
最接近的System.Collections.Immutable是ImmutableStack<T>,它在底层被实现为单链表。然而,公开的功能非常有限,因此除非您确实想要一个堆栈,否则这可能是一个糟糕的选择。您是对的,这ImmutableList<T>是具有不同操作和性能特征的不同数据结构。
F# 标准库中有此内容FSharpList<T>,但由于它是 F# 原语,因此在 C# 中使用起来很尴尬(有可能,只是不会产生干净、惯用的代码)。还需要将完整的 F# 标准库作为依赖项。
在我的一个项目中遇到了同样的问题,我为此编写了一个NuGet 包“ImmutableLinkedList”(github 此处),因此这也可以是一种选择。