私はしばしばこのようなコードを書いています:if (list.Count > 0) { }
これは効率的ですか?
はい。これは、リスト内のフィールドに格納されているリスト内のカウントを取得し、ゼロと比較します。
今の質問は、あなたが要求していない:
を何if (sequence.Count() > 0) { }
については? (Count()
の括弧に注意してください。)
我々は、それが効率的に計算することができるCount
プロパティを持つリストであるかどうかを確認するために、実行時にシーケンスを調べます。そうであれば、それを呼ぶ。そうでない場合は、シーケンス全体を1項目ずつカウントし、それをゼロと比較します。
それほど効率的ではありませんか?
はい。
もっと効率的でしょうか?
if (sequence.Any())
なぜ、より効率的ということでしょうか?
の1つを要素で反復しようとします。成功すると、Any
がtrueになります。失敗した場合、Any
はfalseです。あなたは、ゼロ以上があるかどうかを知るために、瓶の中のゼリービーンの数を数える必要はありません。あなたは、少なくとも1つがあるかどうかを調べる必要があります。
コードはかなり効率的であることに加えて、コードの意図された意味のように読み取られるようになりました。あなたが "リストに項目がありますか?" 「リストには何かありますか? 「リスト内のアイテムの数がゼロよりも多い」ではない
リストのCapacity
プロパティについてはどうなりますか?
これは、リストの内部データ構造にどれくらいのスペースがあらかじめ割り当てられているかを示します。これは、リストに格納できるアイテムの量で、より多くのメモリーを割り当てる必要があります。
"実行時にシーケンスを調べて、効率的に計算できるCountプロパティを持つリストであるかどうかを確認します。それはどういう意味ですか? 'Count'というプロパティをチェックしますか、' ICollection 'が実装されているかどうかチェックしますか?もしもあなたが 'IEnumerable 'の共分散を使うなら、2番目のものは面白い特別な場合があります。 –
CodesInChaos
@CodeInChaos:Countという名前のプロパティのReflection経由で見ると、速度が遅く、信頼性が低くなります。私たちはインタフェースの実装を探します。そして、はい、あなたは共分散問題の結果として偽陰性を得ることができます。もしあなたがそれをするときに痛いなら、それをしないでください。 –
@CodeInChaos 'ICollection'のチェックが失敗すると、コードは非汎用ICollectionをチェックします。したがって、ほとんどのフレームワークコレクションは共分散問題から安全です。 –
phoog