首页 > 解决方案 > 如何在少于线性的时间内获得 ImmutableQueue 的大小

问题描述

我有一个像这样声明的不可变队列

public ImmutableQueue<JObject> MyImmutableQueue => 
  ImmutableQueue.CreateRange<JObject>(myConcurrentQueue);

我想从我的测试类中引用它,如下所示:

myClass.MyImmutableQueue.Count

但是,我看到该Count方法不存在。

我在这里检查了 API ,似乎没有Count,Size或之类的方法Length

如果没有这样的方法,可能我会做一个迭代和计算元素的扩展方法,但那是低效的。

那么,是否有某种方法或某种(小于线性时间复杂度)方法来计算 ImmutableQueue 的元素?

标签: c#

解决方案


没有办法做到这一点,因为ImmutableQueue以需要完全遍历来计算元素的方式实现。即使有反思,你也无法做到这一点。

如果您查看源代码,您会发现它在内部使用了两个ImmutableStacks,并ImmutableStack用 head 和 tail 表示(其中 tail 是 another ImmutableStack)。因此,要计算出元素的数量,您必须计算这些堆栈中的元素数量,并且要做到这一点 - 您必须完全遍历它们。所以这个实现的计数复杂度ImmutableQueue总是线性的。

因此,如果您绝对需要它 - 只需使用IEnumerable.Count()扩展方法,因为无论如何您都无法做得更好。


推荐阅读