Advertisement
atsukanrock

IEnumerable<T> is the best read-only collection parameter

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