LINQやラムダ式にふれてみた！

#はじめに

皆さんはLINQという機能はご存じでしょうか？LINQって中々聞くことが無いと思いますが、
知らない人は凄く便利な機能なので、是非この機会に知ってもらいたいなーと思います！

# LINQとは？
LINQという機能はC#3.0ver登場し、配列やLISTなどのコレクションに格納されている
データを簡単に取り出す事が出来ます。例えばでですが、
データの中に条件に当てはまった物を取り出したり、要素を取得したりなどなど！
他にも色んな機能がありますので、ご紹介いたします！

|メソッド名|処理
|:--|:-:|
|Where(ラムダ式)|条件を満たす要素を全て返す|
|Select(ラムダ式)|各要素に処理をして新しくデーターを返す|
|OrderBy(ラムダ式)|昇順に並べ替えデーターを返す|
|OrderByDescending(ラムダ式)|降順に並べ替えデーターを返す|
|All(ラムダ式)|全要素が条件を満たしてるかを判定|
|Any(ラムダ式)|条件を満たす要素が含まれているかを判定|
|Count()|要数数を返す|
|Max()|最大値を返す|
|Min()|最小値を返す|
|Average()|平均値を返す|
|Sum()|合計値を返す|
|Distinct|重複を除くデーターを返す|

・色んな便利なメソッドがありますが、<font color="Red">ラムダ式</font>ってのがありますね！
　このラムダ式がポイントでもありますので合わせて、ご紹介いたします。


# ラムダ式

・ラムダ式は戻り値のあるメソッドを、より簡潔かつ簡単に書く方法です。
　LINQは戻り値として特定の要素を返してくれるので、ラムダ式と相性がいいって事ですね！

```:ラムダ式の書き方
**・引数無し　戻り値無しの関数の場合**  
① Action 関数名= () => { 実行したい処理 }; 
　関数名();

**・引数有り　戻り値無しの関数の場合**  
②　Action<引数の型> 関数名  = (引数の型　引数の変数) => { 実行したい処理}; 
　　関数名(引数);

**・引数無し　戻り値有りの関数の場合**
③　Func<戻り値の型> 関数名　= () => { return　戻り値 }; 

**・引数有り　戻り値有りの関数の場合**
④　Func<引数の型,戻り値の型> 関数名= (引数の型　引数の変数) => 
　　{
　 　実行したい処理
　　　return　戻り値
　　}; 
                      
```

・では、例としてラムダ式のサンプルメソッドを載せておきますね！
　
```:ラムダ式SAMPLE 
① 　Action<int> Damege= (int num) => { num = num * 2; };

②　 Action<int> Damege = (int num) =>{Debug.Log(num);};
    Damege(8);

③　 Func<int> Damage = () => { return damege; };
    var Value = Damage();

④ 　Func<int, int> Damege = (int damege) =>{return　damege;};
　　var damege = Damege(4);

```
# LiNQ＋ラムダ式
では、早速ですがLiNQのサンプルも載せておきますね！
全部を載せてしまうと長くなるので、ラムダ式を使用するWhere,Any,Selectの３つを載せておきますね！

・皆さん配列に、[30,400,600,301,700,1000,304,800,100900]という体力データーがあり、
　600以上の要素を抽出するにはどいうふうにコードを書きますか？
```
int hp={30,400,600,301,700,1000,304,800,100900};
List<int>　newHp=new List<int>();

  for(int i=0;i<hp.Length;i++)
  {
    if(hp[i]>=600)newHp.add(hp[i]);
  }
```
こんな感じでしょうか？これを、ラムダ式とLinqを交えて書くと次みたいになります！
```:Where
int hp={30,400,600,301,700,1000,304,800,100900};
//Whereメソッド（ラムダ式）
var newHp=hp.Where(x=>x>=600);

*書き方が独特ですが、配列orList.施したいLINQメソッド（名前=>名前 条件式）
*名前は何でもOKなのですが、分かりやすい名前にしてください。
```
・１個目と比べると、かなり簡略的に書けることが分かるかと思います！
　なのでこういった配列やListなどのデーター抽出にはとても有効なのです！

  *Whereメソッドのイメージはふるいや料理で使うボウルでしょうか。
   条件に見合った要素だけが下に落ちるイメージですね！

# Select
では、さっきと同じく体力データーがあり、
アイテムを使うと全体に300ダメージ与えるっていうコード書くとこんな感じになると思います。
```
int hp={30,400,600,301,700,1000,304,800,100900};
List<int>　newHp=new List<int>();

  for(int i=0;i<hp.Length;i++)
  {
    newHp.add(hp[i]-300);
  }
```
さっきと違ってIfが無くなり、まだ見やすいですがLINQで書くとこんな感じになります。
```
int hp={30,400,600,301,700,1000,304,800,100900};
List<int>　newHp=new List<int>();
//Selectメソッド（ラムダ式）
var newHp=hp.Select(n=>n-300);
```
一行で書けていい感じですね！
*Selectのイメージはベルトコンベヤーに並んでる商品に加工するイメージでしょうか...
例え方が特殊ですが、Selectメソッドは要素一つ一つに処理を施し、施した要素を返してくれます。

# Any
またまた、同じく体力データーがあり体力が700以上は不正データとして要素の中にあるのかを調べる
場合どうしますでしょうか？
```
int hp={30,400,600,301,700,1000,304,800,100900};
bool Check=false;

  for(int i=0;i<hp.Length;i++)
  {
    if(hp[i]>=700)Check=true;
    if(Check)
    {
     break;
    }
  }
```
こんな感じでしょうか。リストをFor分で回して不正なデーターが無いかbool値でチェックしています。
これでももちろん、構いませんがメンバ変数が一つ必要になります。
Bool値などあまり増やしたくない時は、Anyメソッドを使うと便利ですよ。
```
 int hp={30,400,600,301,700,1000,304,800,100900};
//Anyメソッド（ラムダ式）
 if(hp.Any(n=n=>700))
 {
 break;
 }
```
AnyもSelectと同じく各要素に対して、条件が真か偽かを調べます。メンバ変数も必要ないので
より簡潔に調べる事ができますよ！

## 終わりに
今回やLINQ（Where、Select,Any）やラムダ式について書いてみました！
LINQたラムダ式も多くの人たちが、詳しく説明してくれていますので調べてみてください！
また、本記事で少しでもLinqやラムダ式を知ってくれる人や興味を
持ってくれたらくれる人がいらっしゃいましたら幸いでございます。
ここまで、お目通しいただきありがとうございました。