【C#】LINQで使用頻度が高い（と思う）拡張メソッドのチートシート

# 最初に

どうも、ろっさむです。

今回は使用頻度の高いLINQの拡張メソッドと使い方を自分用にまとめようと思います。
今後「使うなー」って思ったものは随時追加することがあります。

# 拡張メソッド群

以下はSystem.Linq.Enumerable<T>の拡張メソッドを表にしたものです。

## 判定系一覧

|メソッド名|判定内容|
|----|----|
|All|すべての要素が条件を満たすかどうか|
|Any|条件を満たす要素が含まれているかどうか|
|Contains|指定した要素が含まれているかどうか|

--------

### サンプルコード


#### All：すべての要素が条件を満たすかどうか

```c#
var index = new[] { 10, 20, 30, 40, 50 };

bool isAll = index.All(i => i > 40);
// isAll は false
```
--------

#### Any：条件を満たす要素が含まれているかどうか

```c#
var index = new[] { 10, 20, 30, 40, 50 };

bool isAny = index.Any(i => i > 40);
// isAny は true
```

--------

#### Contains：指定した要素が含まれているかどうか

```c#
var index = new[] { 10, 20, 30, 40, 50 };

bool isContains = index.Contains(40);
// isContains は true
```


## 集計系一覧

|メソッド名|戻り値|
|----|----|
|Max|最大値|
|Min|最小値|
|Sum|合計値|
|Count|要素数|
|Average|平均値|

--------

### サンプルコード


#### Max：最大値を返す

```c#
var index = new[] { 10, 20, 30, 40, 50 };

var maxNum = index.Max();
// maxNum は 50
```
--------

#### Min：最小値を返す

```c#
var index = new[] { 10, 20, 30, 40, 50 };

var minNum = index.Min();
// minNum は 10
```

--------

#### Sum：合計値を返す

```c#
var index = new[] { 10, 20, 30, 40, 50 };

var sumNum = index.Sum();
// sumNum は 150
```

--------

#### Count：要素数を返す

```c#
var index = new[] { 10, 20, 30, 40, 50 };

var countNum = index.Count();
// countNum は 5
```

--------

#### Average：平均値を返す

```c#
var index = new[] { 10, 20, 30, 40, 50 };

var averageNum = index.Average();
// averageNum(double) は 30
```


## 単一要素を取得する系一覧

以下は指定した要素が存在しない場合は例外を投げます。

|メソッド名|戻り値|
|----|----|
|ElementAt|指定した位置の要素|
|First|最初の要素|
|Last|最後の要素|
|Single|唯一の要素|

以下は指定した要素が存在しない場合は型のデフォルト値を返します。

|メソッド名|戻り値|
|----|----|
|ElementAtOrDefault|指定した位置の要素|
|FirstOrDefault|最初の要素|
|LastOrDefault|最後の要素|
|SingleOrDefault|唯一の要素|


--------

### サンプルコード


#### ElementAt系：指定した位置の要素を返す

```c#
var index = new[] { 10, 20, 30, 40, 50 };

var elementAtNum = index.ElementAt(1);
// elementAtNum は 20

var elementAtDefaultNum = index.ElementAtOrDefault(6);
// elementAtDefaultNum は 0
```
--------

#### First系：最初の要素を返す

```c#
var index = new[] { 10, 20, 30, 40, 50 };

var firstNum = index.First();
// firstNum は 10

var firstNum2 = index.First(i => i > 30);
// firstNum2 は 40

var firstDefaultNum = index.FirstOrDefault(i => i > 70);
// firstDefaultNum は 0
```

--------

#### Last系：最後の要素を返す

```c#
var index = new[] { 10, 20, 30, 40, 50 };

var lastNum = index.Last();
// lastNum は 50

var lastNum2 = index.Last(i => 40 > i);
// lastNum2 は 30

var firstDefaultNum = index.LastOrDefault(i => i > 70);
// firstDefaultNum は 0
```

--------

#### Single系：唯一の要素を返す

こちらは要素が2つ以上あった場合は例外が発生します。

```c#
var index = new[] { 10, 20, 30, 40, 50 };

var singleNum = index.Single();
// System.InvalidOperationException: シーケンスに複数の要素が含まれています

var singleDefaultNum = index.SingleOrDefault(i => i > 40);
// singleDefaultNum は 50
```


## 複数要素を取得する系一覧


|メソッド名|戻り値|
|----|----|
|Where|条件を満たす要素全てを含むシーケンス|
|Distinct|重複を除外したシーケンス|
|Skip|指定された数だけ先頭からスキップした残りのシーケンス|
|Take|先頭から指定された数までのシーケンス|

--------

### サンプルコード


#### Where：条件を満たす要素全てを返す

```c#
var index = new[] { 10, 20, 30, 40, 50 };

var whereIndex = index.Where(i => i > 20);
// whereIndex は { 30, 40, 50 }
```
--------

#### Distinct：重複を除外したシーケンスを返す

```c#
var index = new[] { 10, 10, 10, 40, 50 };

var distinctIndex = index.Distinct();
// distinctIndex は { 10, 40, 50 }
```

--------

#### Skip：指定された数だけ先頭からスキップした残りのシーケンスを返す

```c#
var index = new[] { 10, 20, 30, 40, 50 };

var skipIndex = index.Skip(2);
// skipIndex は { 30, 40, 50 }
```

--------

#### Take：先頭から指定された数までのシーケンスを返す

```c#
var index = new[] { 10, 20, 30, 40, 50 };

var takeIndex = index.Take(2);
// takeIndex  は { 10, 20 }
```


## ソート系一覧


|メソッド名|戻り値|
|----|----|
|OrderBy|昇順にソートしたシーケンス|
|OrderByDescending|降順にソートしたシーケンス|
|Reverse|逆順にソートしたシーケンス|

--------

### サンプルコード


#### OrderBy：昇順にソートしたシーケンスを返す

```c#
var index = new[] { 50, 40, 30, 20, 10 };

var orderByIndex = index.OrderBy(i => i);
// orderByIndex は { 10, 20, 30, 40, 50 }
```
--------

#### OrderByDescending：降順にソートしたシーケンスを返す

```c#
var index = new[] { 10, 20, 30, 40, 50 };

var orderByDescendingIndex = index.OrderByDescending(i => i);
// orderByDescendingIndex は { 50, 40, 30, 20, 10 }
```

--------

#### Reverse：逆順にソートしたシーケンスを返す

```c#
var index = new[] { 10, 20, 30, 40, 50 };

var reverseIndex = index.Reverse();
// reverseIndex は { 50, 40, 30, 20, 10 }
```

## 射影系

|メソッド名|戻り値|
|----|----|
|Select|1つの要素を単一の要素に射影したシーケンス|

--------

### サンプルコード


#### Select：昇順にソートしたシーケンスを返す

```c#
var data = new[] {
	new{Name = "Taro", Age = 20},
	new{Name = "Sato", Age = 25},
	new{Name = "Piyo", Age = 10},
};

var selectData = data.Select(i => i.Name);
// selectData は { "Taro", "Sato", "Piyo" }
```

## 変換系一覧


|メソッド名|戻り値|
|----|----|
|OfType|指定した型にキャストしたシーケンス（キャストできない場合、除外）|
|Cast|指定した型にキャストしたシーケンス（キャストできない場合、例外を投げる）|
|ToArray|配列|
|ToList|リスト|

--------

### サンプルコード


#### OfType：指定した型にキャストしたシーケンスを返す

```c#
var index = new[] { 50, 40, 30, 20, 10 };

var ofTypeNum  = index.OfType<float>();
// ofTypeNum  は float型のシーケンスに変換
```
--------

#### Cast：指定した型にキャストしたシーケンスを返す

```c#
var index = new[] { 10, 20, 30, 40, 50 };

var ofCastNum  = index.Cast<float>();
// ofCastNum  は float型のシーケンスに変換
```

--------

#### ToArray：配列を返す

```c#
var index = new[] { 10, 20, 30, 40, 50 };

var arrayIndex  = index.ToArray();
// arrayIndexは int型配列に変換
```

--------


#### ToList：リストを返す

```c#
var index = new[] { 10, 20, 30, 40, 50 };

var listIndex  = index.ToList();
// listIndex  は int型Listに変換
```

# 参考

- [[C#] これだけ押さえておけば大丈夫！？LINQ拡張メソッドまとめ](https://dev.classmethod.jp/articles/c-sharp-linq-extension-methods-review/)
- [LINQの拡張メソッド一覧と、ほぼ全部のサンプルを作ってみました。](https://yujisoftware.hatenablog.com/entry/20111031/1320068429)
- [【C#超絶初心者】LINQは怖くない！ただのIEnumerableの拡張メソッド群です。](https://yutori-techblog.com/howto-linq)
- [Linq 拡張メソッド一覧](https://qiita.com/Apeworks/items/3575bcb90b6097dd6740#single--singleordefaultv)