C#のLINQを学ぶ

# はじめに
C#にはLINQという標準ライブラリがあります。
主にコレクション操作を行うためのものです。
あまり触れてこなかったLINQを備忘録としてまとめておこうと思います。
ちなみに僕は「りんきゅー」派です。(本当はリンクです)

# まずは例を

```C#:例
List<int> list = new List<int>();

for(int i = 0 ; i < 100 ; i++) {
    list.Add(i);
}//0 1 2 3 ...
```
まずは、リストにこんな感じで0～99の値をいれます。

```C#:例
list = list.Where(n => n % 2 == 0) //listから偶数だけを抽出
    .Take(5) //先頭から5つだけを抽出
    .ToList(); //Listに変換
```
```:例
0
2
4
6
8
```
こんな感じでリストの操作を行えます
list.where().Take().ToList();のようにメソッドがチェーンのようにつながっていることからメソッドチェーンと呼ばれています。
ちなみに、返り値はほとんどがコレクションです。なのでToListメソッド等で目的のコレクションに変換する必要があります。

さきほどの0～99の値をリストに入れるという処理も

```C#:
List<int> list = Enumerable.Range(0,100).ToList();
```
この一行で書くことができてしまいます。

# Where 

Whereはコレクションにフィルターをかけます。

```C#:
List<int> list = Enumerable.Range(0,100).ToList();

list = list.Where(n => n % 5 == 0).ToList(); //5の倍数だけのリストができる
//0 5 10 15 20 25 ...
```
```C#
List<int> list = Enumerable.Range(0,100).ToList();

list = list.Where(n => n % 5 == 0 && n % 6 == 0).ToList(); // 条件は複数でも可
list = list.Where(n => n % 6 == 0).Where(n => n % 5 == 0).ToList(); //Whereを複数繋げることもできる

//上二つは同じ処理をする
//0 30 60 90
```

# Take
Takeメソッドは、先頭からいくつの要素をコレクションに入れるかを指定できます。

```C#
List<int> list = Enumerable.Range(0,100).ToList();

list = list.Take(10).ToList();
//0 1 2 3 4 5 6 7 8 9
```

# Skip
Skipメソッドは先頭からいくつの要素を飛ばしてコレクションに入れるかを指定できます。

```C#
List<int> list = Enumerable.Range(0,100).ToList();

list = list.Skip(10).ToList();
//10 11 12 13 14 15 16 17 18 19 20 21 ...
```

TakeとSkipを組み合わせるとa～bまで、みたいなのもできます

```C#
List<int> list = Enumerable.Range(0,100).ToList();

list = list.Skip(10).Take(10).ToList();
//10 11 12 13 14 15 16 17 18 19
```

# Sum, Min, Max, Average
いろいろな計算をしてくれます
返り値はコレクションではなく値です。

```C#
List<int> list = new List<int>() { 1,5,8,10,20,50,90 };

int total = list.Sum();      //合計値
int min = list.Min();        //最小値
int max = list.Max();        //最大値
double ave = list.Average(); //平均

//184
//1
//90
//26.2857142857143
```

# Any
引数の条件に合うものが一つでもあればtrueを返します。一つもなければfalseを返します。

```C#
if(list.Any(n => n % 2 == 0)) {
    Console.WriteLine("偶数が含まれます");
}
```
引数がなければ要素が含まれるかどうかを調べることができます。

```C#
if(list.Any()) {
    Console.WriteLine("要素があります");
}
```

# All
引数の条件に要素の全てが合えばtrueを返します。一つでも合わなければfalseを返します。

```C#
if(list.All(n => n % 2 == 0)) {
    Console.WriteLine("全て偶数です");
}
```

# Select

コレクションのすべての要素に操作を加えます。

```C#
List<int> list = new List<int>() { 1,5,8,10,20,50,90 };

list =  list.Select(n => n * n).ToList(); //全ての要素を2乗する
//1 25 64 100 400 2500 8100
```

# First, Last

Firstメソッドは最初の要素、Lastメソッドは最後の要素を返します。
返り値はコレクションではなく値です。

```C#
List<int> list = new List<int>() { 1,5,8,10,20,50,90 };
Console.WriteLine(list.First()); //1
Console.WriteLine(list.Last());  //90
```

# SkipWhere
SkipWhereメソッドは、条件を満たすまでスキップします。

```C#
List<int> list = new List<int>() { 1,5,8,10,20,50,90,5,10 };

list = list.SkipWhile(n => n < 30).ToList();//30より小さい間はスキップする
//50 90 5 10
```

#TakeWhere
TakeWhereメソッドは、条件を満たすまで要素を返します。falseになった時点で終わります。

```C#
List<int> list = new List<int>() { 1,5,8,10,20,50,90,5,10};

list = list.TakeWhile(n => n < 30).ToList();
//1 5 8 10 20
```

# Distinct
Distinctメソッドは重複のないListを作成します

```C#
List<int> list = new List<int>() { 2,5,6,6,8,5,10,20};

list = list.Distinct().ToList();
//2 5 6 8 10 20
```

# OrderBy, OrderByDescending

この二つのメソッドはソートをしてくれます。
OrderByメソッドが昇順、OrderByDescendingメソッドが降順です。

```C#
List<int> list = new List<int>() { 4,1,10,3,2,16,13 };

list = list.OrderBy(n => n).ToList(); // 1 2 3 4 10 13 16
list = list.OrderByDescending(n => n).ToList(); //16 13 10 4 3 2 1
```

# 最後に
まだまだLinqにはいろいろなメソッドがありますがこのへんで。