LINQ



#Select　要素を操作

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457922/da309a0f-e402-d31b-0cd9-d36e3eb1ee04.png" width=40%>


```c#
using System;

class Prog{
	static void Main() {

		int[] list ={1, 2, 3, 4, 5};
		int[] list2 = new int[list.Length];

		for(int i=0;	i<list.Length;	i++) {
			list2[i] = list[i] * 10;
		}
		foreach(int i in list2){
			Console.WriteLine(	i);		
		}
	}
}
```
LINQにすると

```c#
using System;
using System.Linq;
using System.Collections.Generic;

class Prog{
    static void Main() {
        int[] list ={1, 2, 3, 4, 5};        
        IEnumerable<int> list2 = list.Select(    i => i*10);
		
        foreach(int i in list2){
            Console.WriteLine(  i);     
        }
    }
}
```

Selectは、各要素を操作してIEnumerable\<TResult>で返す

<!--＾〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓-->
#SelectMany　平坦化


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457922/a6e012b8-46af-ebd3-5aa7-4f8c84b2a391.png" width=40%>



```c#
using System;
using System.Collections.Generic;

class Prog{
	static void Main() {

		List<int[]> ls = new List<int[]>(); //配列のリスト

		for(int i=0;	i<3;	i++){	//{0,0} {0,0} {0,0}の3つの配列が入ったリスト
			ls.Add(		new int[2]);
		}
		
		List<int> ls2 = new List<int>();	//これに全ての要素を入れ直す

		foreach(int[] array in ls){	
			foreach(int i in array){	
				ls2.Add(i);
			}
		}

		foreach(var val in ls2) {			
			Console.WriteLine(val);
		}
	}
}
```
LINQにすると


```c#
using System;
using System.Linq;
using System.Collections.Generic;

class Prog{
    static void Main() {

        int[] ls = { 2,2,2};
        IEnumerable<int> ls2	= ls.SelectMany(   x => new int[x] );
		//IEnumerable<int[]> ls3	= ls.Select(x => new int[x]);	//戻り値は配列のコレクション

        foreach(int i in ls2) {
            Console.WriteLine(i);
        }
    }
}
```

SelectManyは、コレクションの要素を操作してバラバラにして返します。
ラムダ式で作られる配列を１つずつintにして、`intのコレクション`にして返します。

一方Selectは、要素の操作までは同じですが`バラバラにしないで、int[]のコレクション`で返します。




<!--＾〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓-->


#Where　条件で抽出


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457922/e9e44694-0659-addc-4c1e-2273d1099ca2.png" width=40%>



```c#
using System;
using System.Collections.Generic;

class Prog{
	static void Main() {

		int[] ls = {1,2,3,4,5};
		List<int> ls2 = new List<int>();

		foreach(int i in ls) {
			if(	i> 3)	ls2.Add(i);
		}
		foreach(var val in ls2) {
			Console.WriteLine(val);
		}
	}
}
```
LINQにすると

```c#
using System;
using System.Linq;
using System.Collections.Generic;

class Prog{
	static void Main() {
		int[] ls = {1,2,3,4,5};
		IEnumerable<int> ls2 = ls.Where(	x => x > 3);

		foreach(int i in ls2) {
			Console.WriteLine(i);
		}
	}
}
```

Whereは、条件を満たす要素だけ抽出します。

<!--＾〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓-->

#Whereと、Selectの組み合わせ

```c#
int[] ls = {1,2,3,4,5};

//出力
40
50
```
4以上の数値だけに10をかけて出力


```c#
using System;
using System.Linq;
using System.Collections.Generic;

class Prog{
	static void Main() {
		int[] ls = {1,2,3,4,5};
		IEnumerable<int> ls2 = ls.Where(x => x > 3).Select(x => x *10);

		foreach(int i in ls2) {
			Console.WriteLine(i);
		}
	}
}
```


<!--＾〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓-->

#OrderBy　並べ替え

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457922/d1319dbf-af1d-61b6-713a-691d43f37257.png" width=40%>


```c#
using System;
using System.Linq;

class Prog {
	public static void Main() {

		int[] ary = { 6, 12, 7, 1, 4 };
		IOrderedEnumerable<int> order = ary.OrderBy(x => x);

		foreach(int i in order) {
			Console.WriteLine(i);
		}
	}
}
```

<!--＾〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓-->



#匿名クラス

```c#
using System;
using System.Linq;

class Prog{
	public static void Main(string[] args) {

		string[] names = {
			"ナポレオン",
			"ピカソ",
			"エジソン",
		};
	}
}
```
LINQを使って文字数を出力

```
ナポレオンは、5文字
ピカソは、3文字
エジソンは、4文字
```

```c#
using System;
using System.Linq;

class Prog{
    public static void Main(string[] args) {

        string[] names = {
            "ナポレオン",
            "ピカソ",
            "エジソン",
        };
        foreach(var ins in names.Select((name) => new { Name = name, Count = name.Length })) {
            string output = string.Format("{0}は、{1}文字", ins.Name, ins.Count);
            Console.WriteLine(output);
        }
    }
}
```

Selectは、匿名クラスのインスタンスを返しています。

<!--＾〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓-->