如何将并发队列转换为不可变队列

时间:2018-05-09 16:22:21

标签: c#

并发字典可以转换为不可变字典,如下所示:

private readonly ConcurrentDictionary<string,JObject> x = new ConcurrentDictionary<string, JObject>();
public ImmutableDictionary<string, JObject> X => x.ToImmutableDictionary();

我试图将并发队列转换为不可变队列,如下所示:

private readonly ConcurrentQueue<JObject> x = new ConcurrentQueue<JObject>();
public ImmutableQueue<JObject> X => x.ToImmutableQueue();

但是,方法ToImmutableQueue不存在。

我查看了API,但我没有看到此方法的等效内容。

那么,将并发队列转换为不可变队列的方法是什么?

1 个答案:

答案 0 :(得分:2)

您应该可以使用工厂方法https://msdn.microsoft.com/en-us/library/dn440262(v=vs.111).aspx

private readonly ConcurrentQueue<JObject> x = new ConcurrentQueue<JObject>();
public ImmutableQueue<JObject> X => ImmutableQueue.CreateRange<JObject>(x);

我怀疑它不包含在扩展中,因为即使使用不可变实现,FIFO队列和LIFO堆栈本质上也被认为是可变数据结构;然而,字典或集合本身被认为具有只读版本。

由于ConcurrentQueue和ImmutableQueue之间的转换实际上是实现的变化而不是接口,所以我认为你失去了ConcurrentQueue的线程安全性,所以我不建议这样做除非这是你的目标。