问题标签 [immutable-collections]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
149 浏览

c# - 将项目添加到 ImmutableList在 ImmutableDictionary 中

我似乎无法弄清楚如何将项目添加ImmutableListImmutableDictionary.

我有以下变量:

我试图在列表中添加一个值:

但是,我收到一个错误,说ImmutableList没有设置器。如何在不重建整个字典的情况下替换字典中的列表?

0 投票
1 回答
80 浏览

c# - Immutable vs Concurrent Collections

In the thread When immutable collections are preferable then concurrent it is stated that immutable collections may be slower but they save memory. How is it possible if every change of immutable collection results in creating new object?

I understand that concurrent collection refers to one object and it uses synchronization primitives. So how the immutable collection can save more memory than concurrent collection?

0 投票
1 回答
65 浏览

c# - 支持不可变集合的集合初始化语法 - 方法的初始化修饰符?

我需要实现一个支持集合初始化语法的不可变集合。问题是为了支持集合初始化语法,集合必须提供适当的公共 Add() 方法。但是,如果集合提供公共 Add() 方法,则它不再是不可变的。

我想要实现的示例:

为了使它工作,我需要 MyImmutableCollection 来实现 IEnumerable 并为 Add() 方法提供适当的签名(有关集合初始化的更多信息在这里):

但是,Add() 方法的存在打破了不变性。我想知道,是否有任何新的方法来实现这个目标?我在 StackOverflow 上看到了这个问题 -我可以使用大括号初始化 BCL 不可变集合吗?- 似乎在那一刻没有合适的解决方案,但这个问题已经很老了,希望 C# 中有一些新功能可用?我已经阅读了有关为不可变对象(此处)提供对象初始化的方法的 init 修饰符的介绍,但似乎该功能已恢复。我想也许有一些功能可以使 Add() 方法仅可用于初始化?

更新。我可能只是将构造函数添加到不可变集合中,例如 new MyImmutableCollection( /* items */ )。但是,使用构造函数可能涉及冗长的语法,尤其是当您需要为每个元素传递多个参数时。使用构造函数的示例:

集合初始化语法示例:

集合初始化语法更简洁,因此更可取。

这就是我们需要添加到类中以支持上面的构造和集合初始化语法: