Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // IEnumerable<T> なことで、引数に対する改変がないことをクライアントに主張している。
- // 引数なしの Count() の実装を知らないと、計算量が多く見える(O(n))のが難点。
- // 実際には BCL では、items が ICollection<T> や ICollection にキャストできる場合、
- // キャストして Count プロパティの取得になるようなので、O(1) だ。
- public double Foo1(IEnumerable<int> items)
- {
- // サンプルなので null チェックなし
- return (double)items.Count(item => item > 5) / (double)items.Count();
- }
- // Foo1 に比べて、Length の取得が O(1) なことが保証されるのが良い。
- // 配列であれば要素数は不変なので、Foo3 とは違い引数を改変しそうにも見えない。
- // ただしクライアントが List<int> を持っている場合に ToArray() が必要なのが良くない。
- public double Foo2(int[] items)
- {
- return (double)items.Count(item => item > 5) / (double)items.Length;
- }
- // Foo1 に比べて、Count の取得が O(1) なことが保証されるのが良い。
- // 配列でも List<int> でも渡せるので、Foo2 よりはクライアントへの制限が少ない。
- // しかし ICollection<T> にしてしまうと、引数が改変されるように見えてしまうのが良くない。
- public double Foo3(ICollection<int> items)
- {
- return (double)items.Count(item => item > 5) / (double)items.Count;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement