C#のLINQでリストの値を操作するサンプルです。
目次
LINQとは
- リストなどのコレクションや配列で加工や集計等できます。
- クエリ構文とメソッド構文があります。
- この記事のサンプルは、メソッド構文です。
- LINQは「リンク」と読み、Language Integrated Queryの略です。
- 以下は、MicrosoftのLINQ でのクエリ構文とメソッド構文 (C#)のリンクです。
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/concepts/linq/query-syntax-and-method-syntax-in-linq
各要素を処理する(Select)
using System;
using System.Collections.Generic;
using System.Linq;
class Test1
{
static void Main()
{
var List1 = new List<string>() { "赤", "黄", "青" };
var List2 = List1.Select(x => x + "です");
List2.ToList().ForEach(Console.WriteLine);//赤です 黄です 青です
}
}
3行目は、LINQを使用するのに必要です。
11行目は、Selectで9行目の各要素に文字列を追加しています。
各要素を条件で判定して抽出する(Where)
var List1 = new List<string>() { "aa", "ab", "ac" };
var List2 = List1.Where(x => x == "ab");
//var List2 = List1.Where(x => a.StartsWith("ab"));
List2.ToList().ForEach(Console.WriteLine);//ab
Whereメソッドで各要素を条件で判定してtrueのものを抽出しています。
4行目のStartWithメソッドは、文字列の先頭が引数の値と一致した場合trueを返します。
要素の重複をなくす(Distinct)
var List1 = new List<string>() { "A", "A", "B" };
var List2 = List1.Distinct();
List2.ToList().ForEach(Console.WriteLine);//A B
Distinctメソッドは、重複をなくします。
要素を並び替える(OrderBy)
var List1 = new List<string>() { "aa", "zz", "cc" };
var List2 = List1.OrderBy(x => x);
List2.ToList().ForEach(Console.WriteLine);// aa cc zz
var List3 = List1.OrderByDescending(x => x);
List3.ToList().ForEach(Console.WriteLine);// zz cc aa
OrderByメソッドは昇順になります。
OrderByDescendingメソッドは降順になります。
要素数を制限する(Take)
var List1 = new List<string>() { "赤", "黄", "青" };
var List2 = List1.Take(2);
List2.ToList().ForEach(Console.WriteLine);// 赤 黄
Takeは引数の値の要素数に制限されます。
要素数をスキップする(Skip)
var List1 = new List<string>() { "赤", "黄", "青" };
var List2 = List1.Skip(2);
List2.ToList().ForEach(Console.WriteLine);// 青
Skipは引数の値の要素数をスキップします。
要素数を取得する(Count)
var List1 = new List<int>() { 1, 2, 3, 4, 5 };
var num1 = List1.Count(x => x > 2);
Console.WriteLine(num1);// 3
Countは、要素数を返します。2より大きい要素数で3を返します。
IEnumerable型をList型に変換(ToList)
var List1 = new List<string>() { "赤", "黄", "青" };
var List2 = List1.Select(x => x);
List1.ToList().ForEach(Console.WriteLine);// 赤 黄 青
2行目のselectメソッドの戻りは、IEnumerable型です。
3行目のToListメソッドは、IEnumerable型をList型に変換します。
先頭/最後の要素を取得する(First/Last)
var List1 = new List<string>() { "赤", "黄", "青" };
var List2 = List1.First();
List2.ToList().ForEach(Console.WriteLine);//赤
var List3 = List1.Last();
List3.ToList().ForEach(Console.WriteLine);//青
Firstメソッドは先頭、Lastメソッドは最後の要素を取得します。
要素の条件が全て一致するか(All)
var List1 = new List<int>() { 5, 8, 9 };
var b1 = List1.All(x => x > 7);//すべての要素は7より大きいか
Console.WriteLine(b1);//False
var b2 = List1.All(x => x > 3);//すべての要素は3より大きいか
Console.WriteLine(b2);//True
すべての要素の条件が一致した場合はtrueをそうでない場合はfalseを返します。
要素の条件が1つでも一致するか(Any)
var List1 = new List<int>() { 5, 8, 9 };
var b1 = List1.Any(x => x > 10);//10より大きい要素はあるか
Console.WriteLine(b1);//False
var b2 = List1.Any(x => x > 8);//8より大きい要素はあるか
Console.WriteLine(b2);//True
要素の条件が1つでも一致した場合はtrueをそうでない場合はfalseを返します。
合計/平均/最大値/最小値
var List1 = new List<int>() { 2, 4, 6 };
Console.WriteLine(List1.Where(x => x > 3).Sum());//10 (合計)
Console.WriteLine(List1.Where(x => x > 3).Average());//5 (平均)
Console.WriteLine(List1.Where(x => x > 3).Max());//6 (最大値)
Console.WriteLine(List1.Where(x => x > 3).Min());//4 (最小値)
3より大きい値を対象にしています。
LINQのメソッドが複数の場合
var List1 = new List<int>() { 10, 20, 30 };
var List2 = List1.Where(x => x > 10)
.Select(x => x + "です");
List2.ToList().ForEach(Console.WriteLine);//20です 30です
3,4行目は、LINQのメソッドを複数指定しています。
関連の記事