Извините, ошибочно думать, что ICollection.Count
- это O(1)
. Это должно быть морально, но нет гарантии, что это так:
public EvilCollection<T> : ICollection<T> {
private readonly ICollection<T> collection;
private readonly Func<int, int> slowGrowingFunction;
public EvilCollection(
ICollection<T> collection,
Func<int, int> slowGrowingFunction)
{
this.collection = collection;
this.slowGrowingFunction = slowGrowingFunction;
}
public int Count {
get {
Thread.Sleep(1000 * this.slowGrowingFunction(this.collection.Count));
return this.collection.Count;
}
}
// other methods wrap methods on collection for ICollection<T>
}
ICollection<T> evilCollection =
new EvilCollection<T>(collection, n => Ackermann(4, n));
О, нет, evilCollection.Count
- это O(Ackermann(4, n))
!
Тем не менее, Я бы не стал беспокоиться об этом, если бы не знал, что могу попасть в злые коллекции, и обнаружил, что это является существенным узким местом производительности. Имейте в виду, код менее понятен , это может быть менее корректно (каков счетчик обновлений после того, как вы кэшировали результат?) и т. д.
Просто напишите самый простой код, который работает (используйте ICollection<T>.Count
). Если и только если это ограничение производительности в вашем приложении, я бы беспокоился о его настройке.