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}
};
Where
Whereは、検索条件を設定してヒットしたものを取得します。
今回はUserClassのFirstNameが”佐藤”のユーザーを取得します。
ラムダ式を利用しFirstName=”佐藤”のものを抽出します。
var satos = user_list.Where(x => x.FirstName == "佐藤");
foreach (var sato in satos)
{
Console.WriteLine($"UserID = {sato.ID} FirstName={sato.FirstName} LastName={sato.LastName} Age={sato.Age}");
}
実行すると以下のように出力されました。
UserID = 0 FirstName=佐藤 LastName=剛 Age=35
UserID = 2 FirstName=佐藤 LastName=裕一 Age=38
UserID = 3 FirstName=佐藤 LastName=大樹 Age=44
UserID = 7 FirstName=佐藤 LastName=大輝 Age=43
varを使っていますが、whereを利用して抽出した場合、戻り値はListではなくIEnumerable<t>になります。まあList自体IEnumerableを継承しているので一緒と言えば一緒のような・・・。
こんな使い方もできます。
Whereは、ラムダ式の結果が「true」になるものを抽出するので例えば・・・
LastNameに「一」という文字が入る人を抽出する
var ichis = user_list.Where(x => x.LastName.Contains("一"));
foreach (var ichi in ichis)
{
Console.WriteLine($"UserID = {ichi.ID} FirstName={ichi.FirstName} LastName={ichi.LastName} Age={ichi.Age}");
}
UserID = 2 FirstName=佐藤 LastName=裕一 Age=38
UserID = 15 FirstName=田畑 LastName=健一 Age=26
UserID = 24 FirstName=遠藤 LastName=一志 Age=39
UserID = 29 FirstName=岩田 LastName=利一 Age=21
UserID = 30 FirstName=佐伯 LastName=圭一郎 Age=30
UserID = 53 FirstName=窪井 LastName=健一 Age=30
40歳以上の人を抽出する
var over40 = user_list.Where(x => x.Age >= 40);
foreach (var user in over40)
{
Console.WriteLine($"UserID = {user.ID} FirstName={user.FirstName} LastName={user.LastName} Age={user.Age}");
}
UserID = 3 FirstName=佐藤 LastName=大樹 Age=44
UserID = 7 FirstName=佐藤 LastName=大輝 Age=43
UserID = 16 FirstName=須藤 LastName=裕介 Age=46
UserID = 17 FirstName=工藤 LastName=洋輔 Age=44
UserID = 32 FirstName=内藤 LastName=行雄 Age=40
UserID = 33 FirstName=伊藤 LastName=彰伸 Age=45
UserID = 38 FirstName=篠田 LastName=優貴 Age=50
UserID = 50 FirstName=渡部 LastName=秀策 Age=42
UserID = 52 FirstName=結城 LastName=慎二郎 Age=45
まとめ
LinQを使えば取得に新しい関数を作成することなく1つの式で実現できた便利です。

コメント