LoginSignup
10
7

More than 5 years have passed since last update.

C#のLINQを学ぶ

Last updated at Posted at 2018-09-11

はじめに

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

まずは例を

List<int> list = new List<int>();

for(int i = 0 ; i < 100 ; i++) {
    list.Add(i);
}//0 1 2 3 ...

まずは、リストにこんな感じで0~99の値をいれます。

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の値をリストに入れるという処理も

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

この一行で書くことができてしまいます。

Where

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

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

list = list.Where(n => n % 5 == 0).ToList(); //5の倍数だけのリストができる
//0 5 10 15 20 25 ...
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メソッドは、先頭からいくつの要素をコレクションに入れるかを指定できます。

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メソッドは先頭からいくつの要素を飛ばしてコレクションに入れるかを指定できます。

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まで、みたいなのもできます

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

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

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を返します。

if(list.Any(n => n % 2 == 0)) {
    Console.WriteLine("偶数が含まれます");
}

引数がなければ要素が含まれるかどうかを調べることができます。

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

All

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

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

Select

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

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メソッドは最後の要素を返します。
返り値はコレクションではなく値です。

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メソッドは、条件を満たすまでスキップします。

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になった時点で終わります。

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を作成します

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メソッドが降順です。

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にはいろいろなメソッドがありますがこのへんで。

10
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7