クラスオブジェクトのリストから検索する方法

LINQ (Language INtegrated Query:統合言語クエリ) とは、
様々な種類のデータ集合に対して標準化された方法でデータを問い合わせることを可能にするために、言語に統合された機能

サンプルデータ

ユーザークラスを用意しました。今回はこれをつかって説明します。

private class UserClass
{
    public int ID { set; get; } = 0;                //ID
    public string FirstName { set; get; } = "";     //苗字
    public string LastName { set; get; } = "";      //名前
    public int Age { set; get; } = 0;               //年齢
}

以下のようなリストを作成しました。

List<UserClass> user_list = new List<UserClass>() {
    new UserClass(){ ID = 0, FirstName = "佐藤", LastName = "剛", Age = 35},
    new UserClass(){ ID = 1, FirstName = "阿部", LastName = "大輔", Age = 36},
    new UserClass(){ ID = 2, FirstName = "佐藤", LastName = "裕一", Age = 38},
    new UserClass(){ ID = 3, FirstName = "佐藤", LastName = "大樹", Age = 44},
    new UserClass(){ ID = 4, FirstName = "田中", LastName = "翼", Age = 26},
    new UserClass(){ ID = 5, FirstName = "岡本", LastName = "直樹", Age = 37},
    new UserClass(){ ID = 6, FirstName = "近藤", LastName = "徹", Age = 39},
    new UserClass(){ ID = 7, FirstName = "佐藤", LastName = "大輝", Age = 43},
    new UserClass(){ ID = 8, FirstName = "岡田", LastName = "実", Age = 21},
    new UserClass(){ ID = 9, FirstName = "佐々木", LastName = "耕平", Age = 29},
    new UserClass(){ ID = 10, FirstName = "加藤", LastName = "幸平", Age = 36},
    new UserClass(){ ID = 10, FirstName = "山田", LastName = "泉", Age = 17},
    new UserClass(){ ID = 12, FirstName = "宮崎", LastName = "修平", Age = 35},
    new UserClass(){ ID = 13, FirstName = "井上", LastName = "俊雄", Age = 28},
    new UserClass(){ ID = 14, FirstName = "坂本", LastName = "正行", Age = 23},
    new UserClass(){ ID = 15, FirstName = "田畑", LastName = "健一", Age = 26},
    new UserClass(){ ID = 16, FirstName = "須藤", LastName = "裕介", Age = 46},
    new UserClass(){ ID = 17, FirstName = "工藤", LastName = "洋輔", Age = 44},
    new UserClass(){ ID = 18, FirstName = "中田", LastName = "茂樹", Age = 33},
    new UserClass(){ ID = 19, FirstName = "山口", LastName = "洋樹", Age = 31},
    new UserClass(){ ID = 20, FirstName = "井上", LastName = "秀則", Age = 23},
    new UserClass(){ ID = 21, FirstName = "西", LastName = "健介", Age = 21},
    new UserClass(){ ID = 22, FirstName = "伊東", LastName = "敏彦", Age = 33},
    new UserClass(){ ID = 23, FirstName = "平山", LastName = "龍", Age = 24},
    new UserClass(){ ID = 24, FirstName = "遠藤", LastName = "一志", Age = 39},
    new UserClass(){ ID = 25, FirstName = "山谷", LastName = "健太", Age = 25},
    new UserClass(){ ID = 26, FirstName = "髙野", LastName = "達也", Age = 36},
    new UserClass(){ ID = 27, FirstName = "速水", LastName = "直人", Age = 24},
    new UserClass(){ ID = 28, FirstName = "梅原", LastName = "貴志", Age = 39},
    new UserClass(){ ID = 29, FirstName = "岩田", LastName = "利一", Age = 21},
    new UserClass(){ ID = 30, FirstName = "佐伯", LastName = "圭一郎", Age = 30},
    new UserClass(){ ID = 31, FirstName = "鈴木", LastName = "裕志", Age = 36},
    new UserClass(){ ID = 32, FirstName = "内藤", LastName = "行雄", Age = 40},
    new UserClass(){ ID = 33, FirstName = "伊藤", LastName = "彰伸", Age = 45},
    new UserClass(){ ID = 34, FirstName = "石森", LastName = "真也", Age = 30},
    new UserClass(){ ID = 35, FirstName = "吉永", LastName = "輝", Age = 26},
    new UserClass(){ ID = 36, FirstName = "松田", LastName = "勝啓", Age = 36},
    new UserClass(){ ID = 37, FirstName = "片山", LastName = "朋幸", Age = 23},
    new UserClass(){ ID = 38, FirstName = "篠田", LastName = "優貴", Age = 50},
    new UserClass(){ ID = 39, FirstName = "矢作", LastName = "篤志", Age = 35},
    new UserClass(){ ID = 40, FirstName = "青柳", LastName = "弘典", Age = 30},
    new UserClass(){ ID = 41, FirstName = "湯浅", LastName = "泰男", Age = 37},
    new UserClass(){ ID = 42, FirstName = "下山", LastName = "貴夫", Age = 22},
    new UserClass(){ ID = 43, FirstName = "小原", LastName = "和也", Age = 24},
    new UserClass(){ ID = 44, FirstName = "岸田", LastName = "宏平", Age = 25},
    new UserClass(){ ID = 45, FirstName = "力武", LastName = "雅人", Age = 24},
    new UserClass(){ ID = 46, FirstName = "宮崎", LastName = "祥幸", Age = 39},
    new UserClass(){ ID = 47, FirstName = "山之内", LastName = "浩幸", Age = 28},
    new UserClass(){ ID = 48, FirstName = "廣田", LastName = "秀実", Age = 34},
    new UserClass(){ ID = 49, FirstName = "能登", LastName = "洋之", Age = 34},
    new UserClass(){ ID = 50, FirstName = "渡部", LastName = "秀策", Age = 42},
    new UserClass(){ ID = 51, FirstName = "道下", LastName = "義久", Age = 31},
    new UserClass(){ ID = 52, FirstName = "結城", LastName = "慎二郎", Age = 45},
    new UserClass(){ ID = 53, FirstName = "窪井", LastName = "健一", Age = 30},
    new UserClass(){ ID = 54, FirstName = "大関", LastName = "宗隆", Age = 36},
    new UserClass(){ ID = 55, FirstName = "仲野", LastName = "大史", Age = 25},
    new UserClass(){ ID = 56, FirstName = "坂元", LastName = "靖範", Age = 39},
    new UserClass(){ ID = 57, FirstName = "永岡", LastName = "寛道", Age = 38},
    new UserClass(){ ID = 58, FirstName = "鳥巣", LastName = "朋広", Age = 35},
    new UserClass(){ ID = 59, FirstName = "海部", LastName = "尚弘", Age = 33}
};

FirstOrDefault

FirstOrDefaultは、検索条件を設定してヒットした1件を取得します。

今回はUserClassのIDに特定の一人を取得するためのキーとして設定して検索しました。
ラムダ式を利用しID=5のものを抽出します。

UserClass user = user_list.FirstOrDefault(x => x.ID == 5);

Console.WriteLine($"UserID = {user.ID}\r\nFirstName={user.FirstName}\r\nLastName={user.LastName}\r\nAge={user.Age}");

実行すると以下のように出力されました。

UserID = 5
FirstName=岡本
LastName=直樹
Age=37

もし見つからない場合は「null」を返します。
複数ある場合は、先頭の1件を取得します。

UserClass user = user_list.FirstOrDefault(x => x.FirstName == "佐藤");

Console.WriteLine($"UserID = {user.ID}\r\nFirstName={user.FirstName}\r\nLastName={user.LastName}\r\nAge={user.Age}");
UserID = 0
FirstName=佐藤
LastName=剛
Age=35

Listには、Findメソッドも用意されていて同様に利用できます。

UserClass user = user_list.Find(x => x.ID == 5);

Console.WriteLine($"UserID = {user.ID}\r\nFirstName={user.FirstName}\r\nLastName={user.LastName}\r\nAge={user.Age}");
UserID = 5
FirstName=岡本
LastName=直樹
Age=37

まとめ

LinQを使えば取得に新しい関数を作成することなく1つの式で実現できた便利です。

コメント

タイトルとURLをコピーしました