たいちょーの雑記

ぼくが3日に一度くらい雑記をかくところ

C#とLINQを真面目に使ってみて思ったこと

C#LINQを真面目に使ってみて思ったこと

LINQしゅごい

結論ファースト


大学の課題で逆ポーランド記法を処理するスタック計算機を作る課題が出されました。
仕様自体はコマンドライン引数から式を受け取って、結果を返すだけの簡単なものなんですが
課題のページに「原則C言語で書くこと」と書いてありました。

_人人人人人人人人人人_
>  ふざけんな!  <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^ ̄

C言語は嫌いではないですが、文字列処理が面倒すぎる(sprintf使えばそうでもないけど)ので

_人人人人人人人人人人人人人_
>  この課題クソだな!?   <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

と心の中で思っていました。
しかし、読み進めると「他の言語でやりたい場合はメールしてね」ということで

さっそくメール

やる言語を決めないとなんですが、

と呟いたら

インターン先で知り合った方から「時代はbash」というみなぎるリプをいただきました。

( ˘ω˘ )
( ˘ω˘ ).oO()
( ˘ω˘ ).oO(bashC#だな・・・)

メールにbashC#でやらせてくださいと書いたら、理由を教えてくださいと言われた。
理由なんてCが嫌だからなんだけど、インタプリタコンパイラで実行速度の比較したいと書いたら当然両方書くことになった。

C#からやろうっと

C#が得意かって言われると Unityでしかやったことないです^^胸を張って言える。
ぶっちゃけLINQもまともに使えなかった。

感動したのはfor文が吹き飛ぶこと
例えば
datasから一つずつ"M"から"-"に置き換えしたあと自作のTokenクラスに変換したリストを作る という処理が必要だったんですがこれを

foreach(var item in datas){
    string tmp = item.Replace("M","-");
    Token tk = new Token(tmp);
    list.Add(tk); 
}

と書いてた(と思う)んですが、

list = datas.Select(item => item.Replace("M", "-")).ToList().ConvertAll(__ => new Token(__));

かっこよく書き換えれました。

え、もうなんなのこれ 意味わかんないんですけど!
hatati

クエリ式?とラムダ式?デリゲート??みたいなので短く書けるんですけど!

隊長まだ未熟なんで使い方をちゃんとわかってないところはあります。
Selectを使えばメソッドに通せる・・・射影できるってっそういうことですよね・・・????

if (list.All(item => item.Operator == Token.ope.error)) { return false; }//Tokenが正当かチェック

これもforeachを吹き飛ばした例ですぅ
Allでコレクションすべてに対して条件式をチェックできるみたいですな

if (list.Select(_ => flag = updateStack(_)).Any(__ => flag == false)) return false;//flagがTokenに異常がない限り最後まで計算

Anyも大体そんな感じ???

なんかメモみたいになったけど、LINQのおかげでキレーになりました。

デリゲートとかラムダ式でよく見る_ってのはhogeみたいなテキトーな変数名だとおもうんですけど、
いろんなところで見る()これってなんですの?
なんかIntelliSenceが波線出したり出さなかったりするんですが、

コメントはちゃんと書こうな

時間があいたら別人が書いたコードになるなんていうのはよく言うことですが、この記事を書くためにコードを見直した時点で
( ´Д`)「わからへん・・・」
とおもったのでちゃんとコメント書こうと思いました。

今回書いたのはこちら github.com

今度はbash側で書きます。