问题标签 [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 回答
397 浏览

c# - ImmutableSortedDictionary 按键范围枚举

我正在阅读有关 C# 的ImmutableSortedDictionary内容System.Collections.Immutable并考虑如何在我的程序中应用它。我非常喜欢 C++ 的lower_boundand upper_bound(请参见此处),并且我很期待看到类似的范围查找。但是,文档中似乎奇怪地没有类似的方法。我错过了什么吗?或者 MS 是否真的提供了一个排序字典而没有对排序范围的有效访问?这似乎不像一个可以IEnumerable在键上做的事情,比如扩展方法,所以我有点困惑,我没有看到集合直接提供的东西。

0 投票
1 回答
212 浏览

f# - 在这种情况下是否可以使用不可变集合?

我已将代码从 python 翻译成 F#,但我希望使用更惯用的语法。我认为有两大障碍

  • 性能差(考虑到n很大)
  • 不够强大的抽象

我拥有的当前(工作)代码是

(在我的笔记本电脑上使用实际数据,大约需要一分钟)

现在有两个可变的,我希望使不可变,如果它是可能的,如果它是有意义的。

  1. mutable acc完成,见下文)
  2. System.Collections.Generic.List包装器
0 投票
3 回答
238 浏览

c# - 如何创建具有私有类型参数和返回类型的快速调用委托,加速 DynamicInvoke

我正在努力创建对 private 的调用ImmutableDictionary.Add,这使我能够利用KeyCollisionBehavior更精细的控制(该Add方法仅在键和值不同时抛出,我需要它总是抛出)。

我可以通过基本反射到达我想要的位置,但是,调用InvokeonMethodInfoDynamicInvoke委托的开销很大(事实上,每次调用的时间几乎增加了三倍,这在我的场景中太重要了)。

我需要调用的函数的签名:

这里的挑战是我需要传递一个私有类型,并且私有类型是签名的一部分。

通常,在调用 之后CreateDelegate,您可以简单地将其转换为 a Func<X, Y, Z>,这会提供近乎直接的调用速度。Func<,>但是如果泛型类型是私有的和/或在编译时不知道,我不知道如何创建。使用object不起作用,会在演员表上产生运行时异常。

这是我目前拥有的代码的缩短版本(删除了很​​多 try/catch 和检查)。这有效:

我意识到上面的代码是用 F# 编写的,但是如果你知道如何在 C# 中解决这个问题,我可以将你的答案翻译成我喜欢的目标语言。

0 投票
2 回答
102 浏览

c# - 多个字段的 C# 不可变计数器

我在消息计数器上具有相当高的吞吐量(每秒数万),并且正在寻找一种有效的方法来获取计数,而无需在任何地方放置锁,或者理想情况下,当我每 10 秒进行一次更新时,不锁定每个消息计数。

使用不可变计数器对象

我正在使用一个不可变的计数器类:

并且会在每个消息处理循环上更新它:

我有很多柜台(未全部显示),因此意味着Interlocked.Increment在各个柜台字段上有很多单独的电话。

我能想到的唯一另一种方法是锁定每一次运行ProcessMessages(这将是广泛的)并且对于作为实用程序的东西而不是在程序崩溃的关键位置上很重。

当我们只需要每 10 秒更新一次时,是否可以在没有硬互锁/线程机制的情况下以这种方式使用不可变计数器对象?

标记检查想法以避免锁定

计时器线程是否可以设置一个标志以供ProcessMessages检查,如果它看到它设置,则再次从零开始计数,即

这会起作用,但是当进程消息停止时更新“停止”(尽管吞吐量非常高,但它确实会在晚上暂停几个小时,理想情况下应该显示实际值而不是最后一个值)。

MyProcessor.ProcessMessages()解决此问题的一种方法是每秒发布一条心跳消息,以强制在reset设置 ManualResetEvent 时对消息计数器进行内部更新和随后的重置。

0 投票
1 回答
296 浏览

c# - 是否可以在 C# Interactive 上使用 Immutable.Collections?

我在 Visual Studio 2019 上使用 C# 交互窗口(即 REPL),并提供最新更新。我想使用不可变的集合,但不能让它们工作。(我在编译的 C# 项目中使用它们没有问题)。

奇怪的是,如果我进入(进入 C# 交互窗口):

C# Interactive 接受这一点,这意味着它可以看到命名空间。但是,如果我然后尝试使用它,例如:

我收到错误消息:“当前上下文中不存在名称‘ImmutableList’。” 如果我完全限定 ImmutableList 的名称,这没有什么区别。

可能我不了解 .NET C# Interactive 正在使用的版本。我知道 Immutable.Collections 现在在 .NET Core 3 中是原生的,但也许 C# Interactive 不使用这个版本?(如何在 C# Interactive 中分辨/指定 .NET 版本?)。即便如此,它没有抗议 using 指令似乎很奇怪。

0 投票
2 回答
149 浏览

java - 将 double[] 转换为不可变列表的成本更低的方法

我想将数组转换double[]为不可变集合以用于值对象。但是,我正在处理一个非常大的数组,并且不断收到错误消息java.lang.OutOfMemoryError: Java heap space

我目前正在使用

我认为这是因为我的程序内存不足。有没有更便宜的方法可以将 double[] 转换为不可变列表?

0 投票
2 回答
367 浏览

c# - 用内部不可变字典构造不可变字典

我有以下字典并希望使其不可变;

然后我打电话

然而,这仍然会给ConcurrentDictionary<Type, Action>我相信的内部字典。

如何使用现有函数以线程安全的方式制作整个字典的不可变副本,或者我是否需要锁定整个操作以确保原子转换?

或者,如果上述方法不可行,我可以重构代码以从一开始就使用 ReadOnlyDictionary 字典,但是我面临与内部字典相同的挑战,以使其在构造过程中只读:

0 投票
0 回答
53 浏览

c# - 从索引枚举 ImmutableSortedSet

ImmutableSortedSet 有一个 IndexOf,我可以用普通的 for 循环枚举该集合。

但是根据 ImmutableSortedSet 的源代码,它看起来必须对每个索引查找进行树搜索。如果我在集合中有数千个项目,这可能不会非常有效(并且非常不必要)。

我可以以某种方式从某个索引和转发中获取枚举数吗?我的意思是更有效地遍历内部节点树?

也许某种通过反射来破解枚举器的方法?我有点希望它快进到某个节点并从中继续枚举。

我试图操纵枚举器中的“_reverse”字段以首先将其“引导”到第一个节点。但我无法坚持改变现场。

另一个想法是最初填充节点堆栈,就好像它已经在枚举中的一半,此时我希望它开始。就是不知道有没有可能。

0 投票
1 回答
27 浏览

java - 为什么我们在初始化时要传递集合(或任何对象)的引用?请检查下面的代码

请检查下面代码的第 5 行。如果有问题,请更正我的问题。

0 投票
4 回答
233 浏览

c# - ImmutableArray如何正确使用

我正在尝试创建一个永远不会改变的常量值数组。我尝试这样的事情......

但是,这个数组仍然从代码的某个地方(另一个线程)更改。如何使数组保持不变并且在程序的整个生命周期中绝对不能改变?我只需要在编译时初始化它,无论什么引用或其他线程改变它,它都不应该改变。但我的情况,它一直在变化。

例如,如果我稍后在代码中或通过另一个线程执行类似的操作,它会发生变化......

我如何解决它?