x はどこから来た?
はじめに
これは自分がラムダ式に出会った頃に受けた印象を元に書いた戯言的な記事です。
ちょっと雑な文章ですがご勘弁を、、、
x はどこから来た?
例えば、こんなコードを見かけたことがあるだろう。
var hoge = foods.Where(x => x.Price >= 100).FirstOrDefault();
このコードがやっていることは、使われているトークンや式を見て何となく想像がつく。
x.Price >= 100
は、価格が100円以上だろうとわかる。
その式がWhere
のカッコで囲まれていることから、SQL文を書いたことがあれば絞り込みを行うんだろうなと想像がつく。価格が100円以上の食べ物foods
のデータ絞り込みを行い、
.FirstOrDefault();
FirstOrDefault
の言葉どうりに先頭データを得ていると想像できる。
ただひとつ腑に落ちないことがある。それがx
である。x.Price
とある。メンバを抱えているようだ。
x
にドットを打つとIntelliSenseでリストが現れる。その中にPrice
が見える。
このコードの前後の文は後述するが、x
は後にも先にもこのカッコ内にしか現れない。
x
はどこから来たのか?
突然、挨拶もなく現れた。=>
もよくわからない。大なりイコール>=
ではないな。見た目は右向き矢印だ。何となく左側のx
が=>
で右側に送り込まれて仕事をしている風に見える。
x
よ、お前は何者だ?
ラムダ式
この文をVB.NETで書き換えたらどうなるか。以下のとおりである。
Dim hoge = foods.Where(Function(x) x.Price >= 100).FirstOrDefault
C#より何をやってるかが分かりやすい。
Function(x)
は誰が見てもx
を引数にとった関数である。その右隣はC#と一緒の式だ。
2つの言語により書き方は違えど、Where
のカッコ内はいずれも「ラムダ式」である。
ラムダ式とは、無名関数のことで、C#では=> の左辺が引数、右辺が実装(多くは単一の式)となっている。
VB.NETのラムダ式は、Function(x)
とあるので誰が見たって関数だとわかる。通常のVB.NETの関数定義の場合、
Function 関数名(x)
となるが、無名なので関数名が省略されている。C#に至ってはFunction
すら無い。引数x
があるのみである。
Whereメソッド
ドットを打つとIntelliSenseのリストが現れるところから、何か実態が存在するかのように勘違いをしてしまうが、x
は単なる関数の引数である。
x
は何でもいい。y
でも、z
でも、arg
でも、food
のf
でもよい。関数を自作するとき、引数名を自分好みに勝手に宣言するのは当たり前のことだ。
class food
{
public string Name { get; set; }
public int Price { get; set; }
public food(string name, int price)
{
Name = name;
Price = price;
}
}
var foods = new List<food> { };
foods.Add(new food("うどん", 80));
foods.Add(new food("もやし", 30));
foods.Add(new food("さんま", 120));
foods.Add(new food("たまご", 200));
var hoge = foods.Where(x => x.Price >= 100).FirstOrDefault();
Where
は、foods
のデータ型であるList<T>
クラスの拡張メソッドである。拡張メソッドとは、雑に説明するとクラスそのものの実装を変えることなく後付けされたメソッドのことである。(ここでは詳しい説明を省略する)
Where
の引数は、シグネチャ(宣言構文)の定められたラムダ式である。ラムダ式なら何でも受け入れるということでは当然ない。
ラムダ式の左辺、x
の型は定められている。List<food>
の一つ一つ、food
クラスである。「うどん」であり「もやし」であり「さんま」であり「たまご」である。
IntelliSenseのリストにPrice
が現れたのは型が定められているからだ。
右辺は引数x
に関するユーザーが評価したいbool型を返す式である。foods
の全てのアイテムについて引数x
を使って評価が行われる。想像するにWhere
の中でfoods
がループで回され、そのループの中で右辺の式が使われているのだろう。
リスト内の全アイテムに対して自分が求める条件にあったアイテムだけを抽出することができる。様々な条件を指定できる。クラスをロジックで抽出できる。何という賢い仕組みだろう!
で、上の例でx
から得たhoge
の中身は「さんま」である。
「さんま」は120円か。今年(2020年)はそんなに安く買えないな、、、
Author And Source
この問題について(x はどこから来た?), 我々は、より多くの情報をここで見つけました https://qiita.com/nekohei/items/251cd1fe6a2dc91c8453著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .