Doesn’t it strike you as odd, that you can write such code in C#:
if (sequence.Any()) ...
and it is efficient as it can be, but when you rely on Count
method:
if (sequence.Count() > 0) ...
you may fall into a trap of extensive computation despite you just need confirmation whether the sequence is empty or not. Well, this disparity annoyed me for a long time and all I could think of was passing somehow a predicate to Count
. It is as fishy as it sounds, and it annoyed me even more.
Until the perspective changed — who said Count
should count anything? Why Count
should jump right away with exact answer?
Count
should be lazy and it should simply return the instance of some numeric like type, say SequenceCount
— that type should keep reference to the sequence, have implicit conversion to Int
and — what is crucial — it should also overload comparison operators. With all those goodies you could finally write:
// Skila syntax if (1...).count() > 0 then stdOut.writeLine("not empty"); end
to see a printout after a few CPU cycles.
Now when I solved this issue I can think of general lazy evaluation design for Skila…