num < .Count()ではなく.Skip(num).Any()の勧め


num < .Count() というコードを見かけたので書いてみた。

.Skip(num).Any() を勧める理由としては、

  • .Count()ではIEnumerableの要素全体を辿るのに対し、.Skip(num)ではIEnumerableの要素をnum個だけ辿って終わる。

このとき、IEnumerableの要素数がnumより小さい場合でSkip(num) をしたとしても、IEnumerableの終端にたどり着いた時点でそれ以上は廻らないため無駄がない。

  • .Count()を使う場合、IEnumerableの要素全体を廻る必要があるため無限シーケンスを扱えないが、.Skip(num).Any()なら無限シーケンスを扱える。

という点が挙げられます。念のため2つ書きましたが、両方とも同じことに対して言葉を変えて言っているだけなので、片方が頭にあれば問題ないです。


補足)

  • Count(), Skip()もO(n)で、オーダーの視点から考えたらどちらでも問題はないので、無限シーケンスを扱うのでなければnum<.Count()でも良いと思います。(こっちのほうが視認性が良いという人もいるでしょうし)

  • 当然、O(n)以下の計算量でIEnumerableの要素数を求められる場合は、そちらを使ったほうが良いです。