[C#]LINQ(Language-Integrated Query)

# LINQとは？
LINQ は、「リストの中のデータを検索したり、並べ替えたり、絞り込んだりするための簡単な方法」と覚えてください。

### 普通のループでデータを探す場合
例えば、普通にリストから特定の数字を探そうとすると、次のようなコードが必要です：

```c#
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9};
List<int> results = new List<int>();

foreach (int number in numbers)
{
    if (number % 2 == 0)  // 偶数を探す
    {
        results.Add(number);
    }
}

Console.WriteLine(results.Count);  // 偶数の数を表示
```

### LINQを使うと…
同じことを LINQ を使うと、次のように簡単に書けます：

```c#
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9};
var results = numbers.Where(n => n % 2 == 0);

Console.WriteLine(results.Count());  // 偶数の数を表示
```

# LINQの基本の形
LINQ の基本的な書き方は次のようなものです。

```c#
var 結果 = リスト.Where(要素 => 条件);
```
これを「翻訳」すると…

>リスト：操作したいリストや配列（例：numbers）
>要素：リストの中の一つ一つの値（例：n）
>条件：その要素がどういう条件に合うか（例：n % 2 == 0 で「偶数」かどうか）

この場合、Where というのは「フィルタリング」して、条件に合うものだけを選び出す、という意味です。

# LINQのよく使うメソッド
### 1. Where: 条件に合うものを選び出す
```c#
var evenNumbers = numbers.Where(n => n % 2 == 0);  // 偶数だけ選ぶ
```
ここで n はただの名前で、好きな名前にしていいんです。x とか item とか、わかりやすい名前に変えてもOK。

### 2. Select: 変換する
```c#
var doubled = numbers.Select(n => n * 2);  // 全部の数字を2倍にする
```
Select はリストの全ての要素に何かしらの処理をしたいときに使います。例えば、すべての数字を 2 倍にしたり、名前を大文字に変えたりします。

### 3. Count: 要素の数を数える
```c#
int evenCount = numbers.Count(n => n % 2 == 0);  // 偶数の数を数える
```
Count は要素の数を数えるためのメソッドです。条件をつけることもできますし、つけない場合はリスト全体の要素数を返します。

### 4. First: 最初の要素を取り出す
```c#
int firstEven = numbers.First(n => n % 2 == 0);  // 最初の偶数を取り出す
```
First は、条件に合う最初の要素を返します。もし、リストにその条件に合う要素がないと、エラーが出ます。

# LINQを使う理由
LINQを使うと、コードが短くてわかりやすくなるからです。

たとえば、配列の中から特定の条件に合うものを探して、リストにまとめたいとき、普通のループでは長いコードを書かないといけませんが、LINQ なら一行でできることが多いです。

# 実例で理解しよう！
```c#
string[] names = { "Alice", "Bob", "Charlie", "David", "Eve" };

// 名前が "A" で始まる人を探す
var aNames = names.Where(name => name.StartsWith("A"));

Console.WriteLine(aNames.Count());  // Aで始まる名前の数を表示
```
このコードでは、次のことをやっています：

names という名前のリストを持っている。
Where で、その中から「Aで始まる名前」を選び出している。
Count() でその結果の数を表示している。

# まとめ
LINQ はリストや配列を簡単に操作する方法です。
Where や Select などを使って、データの絞り込みや変換を行います。
s や n のような部分は、リストの中の一つ一つの要素を指すもので、好きな名前を使って大丈夫です。
LINQを使えば、コードを短く、わかりやすく書けます！

# 補足1 メソッドの種類
LINQ のメソッドは、C# の System.Linq 名前空間に含まれており、公式ドキュメントやいくつかの参考資料で確認できます。以下に LINQ のメソッドを把握する方法をいくつか紹介します。

### 1. Microsoft公式ドキュメント
Microsoft の公式ドキュメントには、LINQ の各メソッドについて詳しい説明が載っています。メソッドの使い方、パラメータ、戻り値など、すべての情報を確認できます。

公式ドキュメントのリンク：https://learn.microsoft.com/ja-jp/dotnet/csharp/linq/

### 2. Visual Studio IntelliSense
Visual Studio を使っている場合、IntelliSense が非常に役立ちます。コードを入力中に .（ドット）を打つと、使用可能な LINQ メソッドが自動的にリスト表示されます。例えば、以下のように入力すると、Where や Select などの候補が表示されます。

```c#
var results = myList.
```

### 3. 代表的なLINQメソッドのリスト
以下は、よく使われる LINQ メソッドのリストです：

Where: フィルタリング（条件に合う要素を選ぶ）
```c#
var results = myList.Where(x => x > 10);
```
Select: 要素を変換する
```c#
var results = myList.Select(x => x * 2);
```
OrderBy: 昇順で並べ替え
```c#
var results = myList.OrderBy(x => x);
```
OrderByDescending: 降順で並べ替え
```c#
var results = myList.OrderByDescending(x => x);
```
First: 最初の要素を取得（条件をつけることも可能）
```c#
var result = myList.First(x => x > 10);
```
FirstOrDefault: 最初の要素、存在しない場合はデフォルト値を返す
```c#
var result = myList.FirstOrDefault(x => x > 10);
```
Count: 要素の数を数える
```c#
var count = myList.Count(x => x > 10);
```
Sum: 要素の合計を計算する
```c#
var total = myList.Sum(x => x);
```
Any: 要素が存在するかどうかを確認
```c#
var hasAny = myList.Any(x => x > 10);
```
All: すべての要素が条件に合っているかを確認
```c#
var allMatch = myList.All(x => x > 10);
```
Distinct: 重複する要素を排除する
```c#
var distinctValues = myList.Distinct();
```
GroupBy: 特定のキーに基づいて要素をグループ化する
```c#
var groups = myList.GroupBy(x => x % 2 == 0);
```
### 4. 参考書籍やチュートリアル
LINQに特化した参考書やオンラインのチュートリアルも豊富です。初心者向けから中級者向けまでさまざまな解説がありますので、必要に応じて参考にしてみると良いでしょう。

### 5. LINQPad
LINQPad は、LINQ のクエリを試すことができるツールです。さまざまなLINQのクエリをインタラクティブにテストしたり学んだりするのに適しています。これを使うと、簡単にLINQの理解が深まります。

公式サイト: https://www.linqpad.net/

# 補足2 ラムダ式
ラムダ式とは、簡単に言うと、「短く書ける小さな関数」のようなものです。C#で書く場合は、匿名関数とも呼ばれます。特定の名前を付ける必要がなく、ちょっとした処理を簡単に書きたい時に使います。

ラムダ式の基本形
C#でのラムダ式の基本形は以下の通りです：

```c#
引数 => 実行する処理
```
具体例を見てみましょう。

### 例: 数字を2倍にする
例えば、数字を2倍にする関数を書きたい場合、通常は次のようにメソッドを作ります：
```c#
int Double(int x)
{
    return x * 2;
}
```
これをラムダ式を使って書くと、次のように短くできます：
```c#
x => x * 2
```
x は引数（数字）を表します。
x * 2 は、その数字を2倍にする処理です。
### LINQ とラムダ式の関係
LINQ はデータ操作のためのクエリ操作（検索やフィルタリング、並べ替えなど）を行いますが、その際にラムダ式がよく使われます。LINQ メソッド（Where や Select など）に対して、「どうやってデータを操作するか」を指定するのにラムダ式が役立ちます。

#### 例: LINQで偶数だけをフィルタリング
次のようなコードで、リストの中から偶数を取り出すとします。
```c#
int[] numbers = { 1, 2, 3, 4, 5, 6 };

// ラムダ式を使って偶数をフィルタリング
var evenNumbers = numbers.Where(n => n % 2 == 0);
```
ここでのラムダ式 n => n % 2 == 0 は、「数字 n が2で割り切れる場合（つまり偶数）」という条件を表しています。

- n: numbers の中の一つ一つの要素（1, 2, 3...）
- n % 2 == 0: n が偶数かどうかをチェック

#### ラムダ式を使わない場合
もしラムダ式を使わずに同じことをしようとすると、次のように少し長いコードになります。
```c#
var evenNumbers = numbers.Where(delegate(int n) { return n % 2 == 0; });
```
ラムダ式を使うことで、これをもっと短く、シンプルに書けるというメリットがあります。

### まとめ
ラムダ式は、短く書ける匿名関数です。複雑な処理をシンプルに書くことができます。
LINQ では、データ操作を行うメソッド（Where、Selectなど）にラムダ式を渡して、「どうやってデータを操作するか」を指定します。
ラムダ式を使うことで、よりシンプルでわかりやすいコードを書くことができ、LINQの力を最大限に活用できます。