如何在不到线性的时间内获得ImmutableQueue的大小

时间:2018-05-10 08:57:24

标签: c#

我有一个 Immutable Queue 声明如下:

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

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

myClass.MyImmutableQueue.Count

但是,我发现Count方法不存在。

我查看了API here,似乎没有CountSizeLength等方法。

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

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

2 个答案:

答案 0 :(得分:3)

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

如果您查看source code,您会看到内部使用两个ImmutableStackImmutableStack表示头部和尾部(尾部是另一个ImmutableStack )。因此,要计算出必须计算这些堆栈中元素数量的元素数量,并且要做到这一点 - 您必须完全遍历它们。因此,ImmutableQueue的此实现的复杂性始终是线性的。

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

答案 1 :(得分:-1)

好吧,考虑到使用public void saveOrUpdateItem(RChatMessage item) { RProfile userProfile = realm.where(RProfile.class).equalTo("id", item.getSender().getId()).findFirst(); item.getSender.setDescription(userProfile.getDescription()); realm.insertOrUpdate(item); } ,公开Queue属性是不合逻辑的。它还会暴露内部实现细节。

您可以重构以在代码中使用Count接口。这样,您可以继承测试代码并自己实现计数属性。