前回はシーケンスの生成について紹介しました。
今回はシーケンスの長さに関する関数を紹介します。
using
例に出すLangExtを使ったコードは、System名前空間とLangExt名前空間がusingされているものとします。
シーケンスの長さを取得する方法
シーケンスの長さを取得するためには、Len / LongLen関数を使います。
そのほか、似たような関数として、条件を満たす要素の個数を取得するCount / LongCount
関数があります。
Len / LongLen関数
Len関数は、標準クエリ演算子のCount関数に対応します。
// 拡張メソッドとして提供している
var n = Create.Seq(10, 20, 30).Len();
LongLen関数は標準クエリ演算子のLongCount関数に対応しており、int
の範囲に収まらない場合でも長さが取得できます。
「シーケンスを受け取ってint
を返す関数」を受け取る高階関数があったとします。
このとき、そのシーケンスの長さを返すだけでいい場合は、ラムダ式を使わずに書けます。
// void Something(Func<ISeq<string>, int> f); という関数があったとして
Something(Seq.Len);
LangExtは拡張メソッドを格納するクラスに「Ext」や「Extension」などの接尾辞を付けていませんが、これは上のように関数をそのまま他の関数に渡すときのことを考えてそうしています。もしSomething(SeqExtension.Len)
のように書く必要があるならば、Something(xs => xs.Len())
のようにラムダ式で書いた方がまだましです。
Enumerable
の場合もやはり、長ったらしいのでラムダ式を書いてしまいます。
Count / LongCount関数
Count / LongCount関数は、標準クエリ演算子の述語を取るバージョンのCount / LongCount関数に対応します。
var n = Create.Seq(1, 2, 3, 4).Count(i => i % 2 == 0);
なぜLenとCountに名前を分けたのか
標準クエリ演算子ではシーケンスの長さを取得する関数も、指定した述語に一致する要素を数え上げる関数も、Countという名前が付けられています。
C#はメソッドのオーバーロードを許しているため仕様上問題はありませんが、単に長さを取得する関数にCountという語は、少々大げさな感じがします。
そのため、LangExtでは(Scalaにならって)別々の名前を付けました。
LengthではなくLenなのは、単純により短く、この業界ではLenがLengthの省略形だと通じやすいという理由からそうしています。
次回
次回は、Sum系メソッドについてです。