我有一个 Immutable Queue 声明如下:
public ImmutableQueue<JObject> MyImmutableQueue =>
ImmutableQueue.CreateRange<JObject>(myConcurrentQueue);
我想从我的测试类中引用它,如下所示:
myClass.MyImmutableQueue.Count
但是,我发现Count
方法不存在。
我查看了API here,似乎没有Count
,Size
或Length
等方法。
如果没有这样的方法,我可能会制作一个迭代和计算元素的扩展方法,但效率很低。
那么,是否有一些方法或一些(少于线性时间复杂度)的方法来计算ImmutableQueue的元素?
答案 0 :(得分:3)
没有办法做到这一点,因为ImmutableQueue
的实现需要完全遍历来计算元素。即使有反思,你也做不到。
如果您查看source code,您会看到内部使用两个ImmutableStack
,ImmutableStack
表示头部和尾部(尾部是另一个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
接口。这样,您可以继承测试代码并自己实现计数属性。