ラムダ式
ラムダ式はデリゲートと組み合わせて使用される。ほぼすべての状況でデリゲートとラムダ式は対になっていることを意識すると良い。ラムダ式はデリゲートを作成するための最も便利な方法です
■リンククエリのコレクションを利用する際にインテリセンスで表示されるヘルプの意味を考える(Whereの場合)
(拡張子)IEnumerable<T> IEnumerable<T>.Where<T>(Func<T, TResult>Predicate) の場合
返り値IEnumerable<T>型、インスタンスはIEnumerable<T>型のコレクションクエリ、そこから標準クエリ演算子のメソッド「Where(T)」を利用し
Func<T, TResult>デリゲート型の返り値からPredicateで基準を満たしているかどうかを判断している。
以下のコードを例に考える
public LambdaTest()
{
Point[] points = { new Point(100, 200),
new Point(150, 250), new Point(250, 375),
new Point(275, 395), new Point(295, 450) };
IEnumerable<Point> select = points.Where(p => p.X * p.Y > 100000);
foreach (Point item in select){Console.WriteLine("Select point : X={0} : Y={1}", item.X, item.Y);}
}
この場合、返り値IEnumerable<Point>型のコレクションクエリselectに、point[]型(IEnumerable<Point>型)のpointsから標準クエリ演算子のメソッド「Where(Point)」を利用し
ラムダ式を使ってFunc<Point, bool>デリゲート型の引き値Pointにpを参照渡ししてコレクション内にアクセス、 「p.X * p.Y > 100000」を演算してbool値を返す。それをPredicateで基準判断し真であれば
selectコレクションに値が加えられる。
<補足>
ほとんどの標準クエリ演算子では、最初の入力がソース シーケンス内の要素の型です。したがって、IEnumerable<Customer> を問い合わせると、入力変数は Customer オブジェクトであると推論されます。
これは、そのメソッドとプロパティにアクセスできることを意味します。
■「Func<T, TResult> デリゲート」と「ラムダ式」の組み合わせ
using System;
public class LambdaExpression
{
public static void Main()
{
Func<string, string> convert = s => s.ToUpper();
string name = "Dakota";
Console.WriteLine(convert(name));
}
}
string引き値、string返り値の関数Funcデリゲートであるconvertをインスタンスして
s に引き値を渡し s.ToUpper() の値を返すようにしています(たった1行のコードでこれだけの事が行われていることに注目)
利用する際は「convert(name)」等のようにして利用します。このnameがsに渡され実行されます
/// <summary>
/// 匿名関数を利用して実行する関数をセレクターで割り当てる方法
/// </summary>
class SelectTest
{
public SelectTest()
{
string[] words = { "orange", "apple", "Article", "elephant" };
//Func<T, TResult> 変数を利用して、ここで利用したい関数をラムダ式で割り当てている
Func<string, string> selector = str => str.ToUpper();
//ここで.Selectで関数を割り当てている
IEnumerable<string> aWords = words.Select(selector);
foreach (string item in aWords){Console.WriteLine(item);}
}
}
<メモ>
現時点、自分にとって式ツリーは高度な機能な様で、とりあえずあんまり無理に利用しようとしない方がよさそう
最終更新:2012年05月18日 23:41