この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 22799|答える: 1

[出典] Linq: 集合が空でないことを判定するためにCount() > 0を使わないでください

[リンクをコピー]
掲載地 2017/10/12 13:25:01 | | | |
Linq以前は、集合が非空であるかどうか、すなわち集合が要素を含むかどうかを判定するために通常、以下の方法を用いました。


LengthやCount属性を使えば、上記の書き方に問題はありません。

しかしLinq時代には、Enumerable.Count拡張法がLengthとCountの性質を「統一」し、非零性を判断するための次の書き方を生み出しました。


この書き方は問題なく動作しますが、非常に深刻なパフォーマンスの問題を引き起こすことがあります。

ただし、これは可能であり必ずしもそうとは限らず、上記のメソッドがArray<T>、List、またはCollectionとして渡されれば<T>問題はありません。



では、いつ何かがうまくいかないのでしょうか? 以下の方法を見てみましょう。


呼ばれた時:



実行速度はかなり遅く、私のコンピュータがソースを実行するのに約70秒かかりました。 Count() > 0。


分析すると、GetNumsコードの5行目のyield returniはintを実行します。 MaxValue、それは必要ですか?

実際、1つの要素を返す限り、その集合は空でないこと、すべての要素を返す必要はないと結論づけられます。

では、どう判断すればいいのでしょうか? Enumerable.any 拡張メソッドを用いることができます:



SomeActionメソッドを次のように修正します:



もう一度呼べば、実行時間はほとんど無視できるほどです。


まとめると、Count() > 0はイールドリターンに遭遇した際に必然的にパフォーマンスの問題を抱えます。






先の:C#の3タイマー実装
次に:js文字列からdateとdateプラス日まで
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com