问题标签 [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 投票
1 回答
422 浏览

c# - BCL 不可变集合:相等是非对称的

由于不可变数据结构是一等值,我们可以像与任何其他值一样比较它们的相等性或顺序。但是在 BCL 不可变集合预览中事情变得复杂了,因为每个不可变集合都可以通过IEqualityComparer<T>/IComparer<T>实例进行参数化。看起来应该不允许比较具有不同比较器的不可变集合(因为没有为比较器本身定义相等),因为它使相等关系不对称:

这种行为会以某种方式得到解决吗?

0 投票
0 回答
657 浏览

c# - 是否 System.Collections.Immutable.IImmutableList.Add from Microsoft's Preview of Immutable Collections 有职位要求吗?

我正在实现一个不可变集合,它提供 O(1) 堆栈操作和 O(log n) 列表操作。因此,在前面添加元素比在后面添加元素要快。可以有效实现System.Collections.Immutable.IImmutableList<T>.Add()https://nuget.org/packages/Microsoft.Bcl.Immutablehttp://blogs.msdn.com/b/bclteam/archive/2012/12/18/preview-of-immutable- collections-released-on-nuget.aspx)将元素添加到集合的前面而不是后面?

以下是接口的定义方式:

0 投票
4 回答
6209 浏览

c# - ImmutableArray 之间的区别和不可变列表

ImmutableArray<T>和之间有什么区别ImmutableList<T>,最好在哪里使用?

0 投票
1 回答
2868 浏览

c# - 为什么是 ImmutableList的枚举器与 List 相比要慢得多

我有一段代码经常迭代一个小列表。鉴于列表在运行时从不更改,我将实现替换为ImmutableList<T>. 查看 dotTrace 的性能跟踪,这比正常的性能差得多List<T>

dotTrace 结果List<T>在左边,ImmutableList<T>在右边)

为什么会发生这种情况,是否有解决方法?

0 投票
2 回答
1832 浏览

c# - 不可变数组在哪里?

为什么在 Microsoft Immutable Collections NuGet 包版本1.0.34中似乎没有ImmutableArray

在此处输入图像描述

0 投票
3 回答
2809 浏览

c# - 应该更喜欢 ImmutableDictionary 还是 ImmutableSortedDictionary?

我听说 .NETSystem.Collections.Immutable集合被实现为平衡二叉树,以Dictionary通过使用整数值GetHashCode作为排序键来满足它们的不变性约束,甚至是传统上对哈希表建模的集合,如 。

如果我有一种生成哈希码便宜的类型,并且比较便宜(例如stringor int),并且我不关心我的集合的排序性,那么选择是否有意义,ImmutableSortedDictionary因为底层数据结构无论如何都排序了?

0 投票
3 回答
1876 浏览

scala - 添加到不可变的 HashSet

抱歉,我最近在第 685 页的第 2 版“Scala 编程”中看到了一个示例,这对我来说似乎很奇怪:

怎么可能添加一些不可变的集合?我尝试了 REPL,它工作正常!

奇怪的事实是 += 运算符没有在immutable.HashSet api 页面中定义。有人可以帮我理解发生了什么吗?

谢谢。

0 投票
3 回答
456 浏览

c# - 使具有公共属性的对象列表/集合真正只读

我有以下问题。

假设有一个这样定义的公共 Class1:

我不允许修改类定义 - 它被其他人使用,他们需要以这种方式编写。麻烦来了。

我需要static List<Class1> myStaticList它只能在 Class2 内部修改,而其他任何地方都是真正只读的。“真正只读”是指用户不得更改任何内容,包括列表元素的属性。

像:Class2.list[0].pr1="newValue"从 Class2 外部调用的东西应该被阻止。

ReadOnlyCollection不要做任何工作,因为用户仍然可以修改列表的给定元素,因此此处给出的解决方案List<T> readonly with a private set不能满足我的需求。

基本上我已经找到了很多使列表/集合只读的可能方法(例如IReadOnlyList),但是如果它们具有公共设置器,它们都留下了更改给定列表元素属性的可能性。

我发现的唯一解决方案是创建新类:

但我希望两个能找到更好的方法,因为在我看来,仅仅因为一个只读列表就定义一个全新的类有点奇怪

提前感谢任何线索。

这甚至可能以这种不同的方式进行吗?


现实世界的上下文是这样的:

在代码中,我们编辑数据库,我想要备份已更改初始值的记录列表。我想让它保持静态只是为了有可能在我想要的任何地方恢复数据库。Class1 包含我们数据库的单个记录的所有值,因此List<Class1>我可以保留所有修改过的记录并在需要时恢复它们。而且由于它是备份,因此必须是只读的,因为意外的更改可能导致灾难。

0 投票
1 回答
319 浏览

c# - 在 C# 中寻找可用的不可变布尔数组

我有一个具有布尔数组成员的类。如果我修改此数组的元素,则应创建该实例的新修改副本。听起来像是使用不可变类型的绝佳机会。谷歌搜索显示微软提供了一个新的库不可变集合,它非常适合另一个用例。但不适用于上述 bool 数组成员。

看似合适的类型 ImmutableArray 已被暂时删除,并且文档似乎也没有包含索引器。潜在的替代 ImmutableList 不适用于结构。我不愿意介绍另一个第三方库,所以我想知道我有哪些选项以及应该选择哪些选项。

我可以创建一个 Bool 类来满足引用类型的要求。或者我可以使用 BitArray,但尝试像这样使用失败并出现编译错误:

所以有什么想法我应该做什么?

0 投票
4 回答
28779 浏览

c# - 为什么使用 ImmutableList 而不是 ReadOnlyCollection?

.NET 4.5 有一个新的命名空间System.Collections.Immutable

这个包提供了线程安全的集合,并且保证永远不会改变它们的内容,也称为不可变集合。

我很困惑。ReadOnlyCollection类不是已经解决了线程安全问题吗?为什么要改用ImmutableList


我知道还有一个IReadOnlyList接口。这并不能隐式解决线程安全问题,因为其他线程可能会通过另一个接口编辑对象。