C# LINQ(ラムダ式)
ラムダ式で記述するLINQのサンプル集です。
クエリ式のサンプルはこちらをご覧ください。
このページのサンプルは以下データを元にしています。
- 【データクラス】
-
class Syain { public Syain(string id, string name, int age, string dept) { this.id = id; this.name = name; this.age = age; this.dept = dept; } public string id { get; set; } // 社員ID public string name { get; set; } // 名前 public int age { get; set; } // 年齢 public string dept { get; set; } // 部署 }
- List生成
-
var syainList = new List<Syain>(); syainList.Add(new Syain("002", "山田", 35, "営業部")); syainList.Add(new Syain("004", "鈴木", 28, "営業部")); syainList.Add(new Syain("005", "高橋", 46, "経理部")); syainList.Add(new Syain("001", "鈴木", 32, "総務部")); syainList.Add(new Syain("003", "伊藤", 25, "開発部")); syainList.Add(new Syain("006", "佐藤", 30, "開発部")); syainList.Add(new Syain("007", "田中", 42, "開発部"));
Linqを使う時は「System.Linq」をインポートしてください。
- (System.Linqのインポート宣言)
-
using System.Linq
検索(where 等価)
- 例)部署が「営業部」のデータを配列型で抽出する
-
var result = syainList .Where(x => x.dept == "営業部") .ToArray();
- 【結果】
- [002 山田 35 営業部] [004 鈴木 28 営業部]
検索(where 大小)
- 例)年齢が30歳未満のデータを配列型で抽出する
-
var result = syainList .Where(x => x.age < 30) .ToArray();
- 【結果】
- [004 鈴木 28 営業部] [003 伊藤 25 開発部]
検索(where 複数)
- 例)年齢が30歳以上40歳未満のデータを配列型で抽出する
-
var result = syainList .Where(x => x.age >= 30 && x.age < 40) .ToArray();
- 【結果】
- [002 山田 35 営業部] [001 鈴木 32 総務部] [006 佐藤 30 開発部]
特定列の抽出(Select)
- 例)名前のみをList型で抽出する
-
List<string> result = syainList .AsEnumerable().Select(x => x.name) .ToArray().ToList<string>();
- 【結果】
- 山田 鈴木 高橋 鈴木 伊藤 佐藤 田中
存在するかどうか(Exists)
- 例)社員IDが"008"のデータが存在するかどうかを取得する
-
bool b = syainList.Exists(x => x.id == "008");
- 【結果】
- false
結果はbool型(true/false)で返ります。
件数(count)
- 例)部署が「開発部」の人数を取得する
-
var result = syainList .Where(x => x.dept == "開発部") .Count();
- 【結果】
- 3
部分一致検索(like)
- 例)名前が「鈴木」で始まるデータを抽出する
-
var result = syainList .Where(x => x.name.StartsWith("鈴木")) .ToArray();
- 【結果】
- [004 鈴木 28 営業部] [001 鈴木 32 総務部]
前方一致の場合は、StartsWithを使用します。
部分一致の場合は、Containsを使用します。
後方一致の場合は、EndsWithを使用します。
IN検索(in)
- 例)社員IDが"002","005"のデータを抽出する
-
//IN条件を配列で生成する string[] arr = new string[]{"002", "005"}; var result = syainList .Where(x => arr.Contains(x.id)) .ToArray();
- 【結果】
- [002 山田 35 営業部] [005 高橋 46 経理部]
グルーピング(group by)
- 例)部署の一覧を抽出する
-
var result = syainList .GroupBy(x => new{x.dept}) .Select(x => new{x.Key.dept}) .ToArray();
- 【結果】
- 営業部 経理部 総務部 開発部
グルーピング+件数(group by + count)
- 例)部署毎の人数を求める
-
var result = syainList .GroupBy(x => new { x.dept }) .Select(x => new { x.Key.dept, sum = x.Select(y => y.dept).Count() }) .ToArray();
- 【結果】
- 営業部 - 2 経理部 - 1 総務部 - 1 開発部 - 3
合計(sum)
- 例)営業部に所属している人の年齢の合計を求める
-
var result = syainList .Where(x => x.dept == "営業部") .Select(x => x.age) .Sum();
- 【結果】
- 63
ソート・昇順(order by asc)
ラムダ式でソートを行いたい場合は「.OrderBy()」を使用します。
- 例)年齢順にソート(昇順)する
-
var result = syainList .OrderBy(x => x.age) .ToArray();
- 【結果】
- [003 伊藤 25 開発部] [004 鈴木 28 営業部] [006 佐藤 30 開発部] [001 鈴木 32 総務部] [002 山田 35 営業部] [007 田中 42 開発部] [005 高橋 46 経理部]
ソート・降順(order by desc)
ラムダ式で降順ソートを行いたい場合は「.OrderByDescending()」を使用します。
- 例)年齢順にソート(降順)する
-
var result = syainList .OrderByDescending(x => x.age) .ToArray();
- 【結果】
- [005 高橋 46 経理部] [007 田中 42 開発部] [002 山田 35 営業部] [001 鈴木 32 総務部] [006 佐藤 30 開発部] [004 鈴木 28 営業部] [003 伊藤 25 開発部]
ソート・複数(order by 複数)
- 例)部署(昇順)、年齢(昇順)でソートを行う
-
var result = syainList .OrderBy(x => x.dept) .ThenBy(x => x.age) .ToArray();
- 【結果】
- [004 鈴木 28 営業部] [002 山田 35 営業部] [003 伊藤 25 開発部] [006 佐藤 30 開発部] [007 田中 42 開発部] [005 高橋 46 経理部] [001 鈴木 32 総務部]
ラムダ式でソート条件を複数指定したい場合は、
1番目の条件にOrderBy(降順の場合はOrderByDescending)、
2番目以降の条件にThenBy(降順の場合はThenByDescending)を使用します。
ソート・複数[昇順/降順](order by 複数(asc + desc))
- 例)部署(昇順)、年齢(降順)でソートを行う
-
var result = syainList .OrderBy(x => x.dept) .ThenByDescending(x => x.age) .ToArray();
- 【結果】
- [002 山田 35 営業部] [004 鈴木 28 営業部] [007 田中 42 開発部] [006 佐藤 30 開発部] [003 伊藤 25 開発部] [005 高橋 46 経理部] [001 鈴木 32 総務部]
最初の1件のみ抽出
- 例)年齢順にソートした最初の1件のみ取得する
-
var result = syainList .OrderBy(x => x.age) .FirstOrDefault();
- 【結果】
- [003 伊藤 25 開発部]
※データが無い場合はnullが返ります。
UNION、UNION ALL
- 例)syainList1とsyainList2をUNIONする。
-
var result = syainList1 .Union(syainList2) .ToArray();
※syainList1とsyainList2の内容は、上記syainListと同じものだと想定します。
- 【結果】
- [002 山田 35 営業部] [004 鈴木 28 営業部] [005 高橋 46 経理部] [001 鈴木 32 総務部] [003 伊藤 25 開発部] [006 佐藤 30 開発部] [007 田中 42 開発部]
UNION ALLの場合は、Union()の代わりにConcat()を使用します。
備考
- 結果を配列で取得したい場合は「.ToArray()」、リストで取得したい場合は「.ToList()」を使用します。