.NET. Есть ли где-нибудь односвязный список в System.Collections.Immutable?

В функциональном программировании односвязные списки чрезвычайно популярны, потому что легко повторно использовать вложенные списки без выделения памяти или копирования значений. Это означает, что вы можете добавлять или удалять элементы с одного конца без какого-либо распределения. Список 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> лучшим вариантом здесь?


person JamesFaix    schedule 01.11.2017    source источник
comment
Это может вас заинтересовать: stackoverflow.com/a/10045677/84206   -  person AaronLS    schedule 02.11.2017
comment
Это полезно для вас? ссылка   -  person Sean O'Neil    schedule 02.11.2017
comment
Я думаю, что ImmutableQueue может подойти для моего варианта использования, спасибо   -  person JamesFaix    schedule 02.11.2017


Ответы (1)


В библиотеке базовых классов .NET (на момент написания этой статьи) нет хорошего ответа на этот вопрос.

Ближе всего в System.Collections.Immutable находится ImmutableStack<T>, который реализован как односвязный список под капотом. Однако доступные функции очень ограничены, поэтому, если вам действительно не нужен стек, это, вероятно, плохой выбор. Вы правы, что ImmutableList<T> - это другая структура данных с другими операциями и характеристиками производительности.

В стандартной библиотеке F# есть FSharpList<T>, но из-за того, что он является примитивом F#, его неудобно использовать из C# (это возможно, просто это не приведет к чистому идиоматичному коду). Также требуется использование полной стандартной библиотеки F# в качестве зависимости.

Столкнувшись с той же проблемой в одном из своих проектов, я написал пакет NuGet "ImmutableLinkedList" ( github здесь) для этого, так что это тоже может быть вариантом.

person ChaseMedallion    schedule 16.11.2019