C#プチリファレンス

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, "開発部"));

検索(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 開発部]

件数(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)

例)年齢順にソート(昇順)する
var result = syainList
  .OrderBy(x => x.age)
  .ToArray();
【結果】
[003 伊藤 25 開発部] [004 鈴木 28 営業部] [006 佐藤 30 開発部] [001 鈴木 32 総務部] [002 山田 35 営業部] [007 田中 42 開発部] [005 高橋 46 経理部]

ラムダ式でソートを行いたい場合は、OrderByを使用します。

ソート・降順(order by desc)

例)年齢順にソート(降順)する
var result = syainList
  .OrderByDescending(x => x.age)
  .ToArray();
【結果】
[005 高橋 46 経理部] [007 田中 42 開発部] [002 山田 35 営業部] [001 鈴木 32 総務部] [006 佐藤 30 開発部] [004 鈴木 28 営業部] [003 伊藤 25 開発部]

ラムダ式で降順ソートを行いたい場合は、OrderByDescendingを使用します。

ソート・複数(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()を使用します。

ToTop