【问题标题】:.NET - Is there a singly-linked list in System.Collections.Immutable somewhere?.NET - System.Collections.Immutable 某处是否有单链表?
【发布时间】:2018-04-14 09:18:55
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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

System.Collections.Immutable 中最接近的东西是ImmutableStack<T>,它在底层实现为单链表。然而,暴露的功能非常有限,所以除非你真的想要一个堆栈,否则这可能是一个糟糕的选择。你是对的,ImmutableList<T> 是一个不同的数据结构,具有不同的操作和性能特征。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 2011-03-01
    • 2011-01-25
    • 1970-01-01
    相关资源
    最近更新 更多