C# 如何在少于线性时间内获得不可变队列的大小

C# 如何在少于线性时间内获得不可变队列的大小,c#,C#,我有一个如下声明的不可变队列: public ImmutableQueue<JObject> MyImmutableQueue => ImmutableQueue.CreateRange<JObject>(myConcurrentQueue); myClass.MyImmutableQueue.Count 但是,我看到,Count方法不存在 我检查了API,似乎没有任何方法,例如计数、大小或长度 如果没有这样的方法,我可能会做一个扩展方法来迭代和计算元素,

我有一个如下声明的不可变队列:

public ImmutableQueue<JObject> MyImmutableQueue => 
  ImmutableQueue.CreateRange<JObject>(myConcurrentQueue);
myClass.MyImmutableQueue.Count
但是,我看到,
Count
方法不存在

我检查了API,似乎没有任何方法,例如
计数
大小
长度


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


那么,是否有某种方法或某种(小于线性时间复杂度的)方式来计算不可变队列的元素数呢?

没有办法做到这一点,因为
不可变队列
是以一种需要完全遍历来计算元素数的方式实现的。即使有了反思,你也无法做到这一点

如果您查看,您将看到它在内部使用两个
ImmutableStack
s,并且
ImmutableStack
用头和尾表示(其中尾是另一个
ImmutableStack
)。所以要计算出元素的数量,你必须计算这些堆栈中元素的数量,要做到这一点,你必须完全遍历它们。所以,
ImmutableQueue
的这个实现的计数复杂性总是线性的


因此,如果您确实需要它,只需使用
IEnumerable.Count()
扩展方法,因为您无论如何都做不到更好的结果。

“可能我会创建一个扩展方法”——这应该是不必要的。标准应该已经起作用了。这到底怎么可能呢?!您可以在队列上执行的所有操作都在单个元素上工作。无论内部数据表示形式如何,count私有变量都可以与递增或递减的每个操作一起使用。这是一件小事,完全独立于内部表示。根本不需要遍历数据。@KornelijePetak使用单独的可变变量来跟踪不可变队列中的项目数完全违背了它的目的,因此不是一个选项。当然,可以使用另一个类扩展ImmutableQueue,该类将携带count变量(也是不可变的),但我怀疑OP所要求的是什么。如果只给您一个ImmutableQueue实例,那么在不遍历整个队列的情况下,不可能对其元素进行计数。我完全误解了你的第一句话。出于某种原因,我认为你是在理论上讲,而你只是在陈述关于实际实施的事实。我在读这篇文章时也有点粗心,因此我发表了评论。事实上你是对的。