Edited at

LangExtの紹介 - シーケンスの長さに関する関数

More than 5 years have passed since last update.

前回はシーケンスの生成について紹介しました。

今回はシーケンスの長さに関する関数を紹介します。


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系メソッドについてです。