ページ

2006年7月19日水曜日

C# 2.0 の匿名メソッドを使って関数型的なリスト処理をする

Functional list processing in C# 2.0 with anonymous delegates より


「関数型言語のベネフィットのひとつは非常に柔軟なリスト処理ができるってことだよね」 みたいな感じで始まってるんですが、最初に 「ある条件に一致する要素すべてを削除する RemoveAll<T> メソッド」 の実装例を紹介しています。この 「ある条件」 を Predicate<T> で渡せるようにしておくと匿名メソッドで指定することもできるし便利っていうことで、記事の中ほどで List<T> が持っている Predicate<T> や Comparison<T> を引数に取るメソッドをずらずらっと紹介しています。


このずらずらっと紹介しているのの最後が ConvertAll メソッドなんですが、これを使ったサンプルとして


    static List<string> GetBigFiles(string directory, int bigLength)
{
List<string> paths = new List<string>(Directory.GetFiles(directory));
return paths.ConvertAll<FileStream>( File.OpenRead )
.FindAll( delegate(FileStream f) { return f.Length >= bigLength; } )
.ConvertAll<string>( delegate(FileStream f) { return f.Name; } );
}


こんなのが紹介されています。
ディレクトリのファイル名一覧を List に入れておいて、読み取り用にオープンして、FileStream にして、ファイルサイズが指定されたバイト数より大きいか判断して、その FileStream の Name を再び List にして、それを返す。。。
いいっスw 実用で使うコードにこんなの書かれると 「ちょっと待てよ」 と思っちゃうとは思いますがw、こういうの大好きwww


で、続いて


    void foo()
{
Debug.Write("entering foo()");
try
{
// 処理をする
}
catch (Exception e)
{
// 例外を処理する
throw;
}
Debug.Write("exiting foo()");
}


の 「処理をする」 と 「例外を処理する」 の部分も delegate で与えちゃう例が紹介されています。
これもいいなw

0 件のコメント:

コメントを投稿