是否存在C#的开源不可变字典,具有快速“With / Without”方法?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否存在C#的开源不可变字典,具有快速“With / Without”方法?相关的知识,希望对你有一定的参考价值。

我正在寻找一个适当的C#immutable字典,使用快速更新方法(创建一个略有变化的字典的部分副本)。我自己实现了一个,使用拉链来更新红黑树,但它并不是特别快。

通过'不可变字典',我不只是指readonly或const。我想要一些具有相当快速的“With”和“Without”或类似方法的东西,这些方法可以在不修改原始内容的情况下稍微修改一些东西。

另一种语言的例子是map in Scala

答案

有一些基于只读二进制AVL树的implementation of the immutable dictionary

/**
 * To modify, use the InsertIntoNew and RemoveFromNew methods
 * which return a new instance with minimal changes (about Log C),
 * so this is an efficient way to make changes without having
 * to copy the entire data structure.
 */

请看一下InsertIntoNew()方法:

/** Return a new tree with the key-value pair inserted
 * If the key is already present, it replaces the value
 * This operation is O(Log N) where N is the number of keys
 */
public ImmutableDictionary<K,V> InsertIntoNew(K key, V val)
{ ... }

RemoveFromNew()方法:

/** Try to remove the key, and return the resulting Dict
 * if the key is not found, old_node is Empty, else old_node is the Dict
 * with matching Key
 */
public ImmutableDictionary<K,V> RemoveFromNew(K key, out ImmutableDictionary<K,V> old_node)
{ ... }

此外,还有另一种实现:Immutable AVL Tree in C#。它具有相同的O(log N)查找和插入时间。

Additional references

以上是关于是否存在C#的开源不可变字典,具有快速“With / Without”方法?的主要内容,如果未能解决你的问题,请参考以下文章

Objective - C NSDictionary不可变字典和NSMutableDictionary可变字典

数据类型之集合

字典(dict)常用操作

C# Dictionary<> 和可变键

python 中关于字典的键

从具有可变长度的列表字典创建数据框