C#におけるLINQの小ネタ1
下記は仕事中に見かけたソースコードで、冗長になっている記述です。
「ソースコード抜粋」の①、②は共にListをLINQで絞り込み、件数を取得する処理です。
①は「Where」で条件を指定し、「Count()」で件数を取得しています。
しかし、「Count()」内にカウントする条件を指定することで簡潔に書けるため、②の記述で良いかと思います。
どちらも結果自体は同じになるため、誤りではありません。
といいつつ、自分でも気を抜くとうっかり①の記述をしていることがあるので、戒めの意味を込めてブログに掲載。
ソースコード抜粋
int count = users.Where(f => f.Age >= 20).Count(); // ① int count = users.Count(f => f.Age >= 20); // ②
ソースコード全体
using System; using System.Collections.Generic; using System.Linq; namespace ConsoleApp1 { class Program { static void Main(string[] args) { // テストデータを取得 List<UserInfo> users = GetTestData(); // 年齢が20以上のユーザ数を取得 int count = users.Where(f => f.Age >= 20).Count(); // ① int count = users.Count(f => f.Age >= 20); // ② Console.WriteLine("件数:{0}", count); Console.Read(); } /// <summary> /// テストデータを取得 /// </summary> /// <returns>テストデータリスト</returns> static List<UserInfo> GetTestData() { List<UserInfo> list = new List<UserInfo>(); list.Add(new UserInfo() { UserID = "UserA", UserName = "ユーザA", Age = 18 }); list.Add(new UserInfo() { UserID = "UserB", UserName = "ユーザB", Age = 34 }); list.Add(new UserInfo() { UserID = "UserC", UserName = "ユーザC", Age = 30 }); list.Add(new UserInfo() { UserID = "UserD", UserName = "ユーザD", Age = 38 }); list.Add(new UserInfo() { UserID = "UserE", UserName = "ユーザE", Age = 45 }); list.Add(new UserInfo() { UserID = "UserF", UserName = "ユーザF", Age = 24 }); list.Add(new UserInfo() { UserID = "UserG", UserName = "ユーザG", Age = 32 }); list.Add(new UserInfo() { UserID = "UserH", UserName = "ユーザH", Age = 19 }); list.Add(new UserInfo() { UserID = "UserI", UserName = "ユーザI", Age = 23 }); return list; } } /// <summary> /// ユーザ情報を保持するクラス /// </summary> class UserInfo { /// <summary> /// ユーザID /// </summary> public string UserID { get; set; } /// <summary> /// ユーザ名 /// </summary> public string UserName { get; set; } /// <summary> /// 年齢 /// </summary> public int Age { get; set; } } }
※上記ソースコードを実行する場合は「int count = ~」となっている①、②のどちらかをコメントアウトしてください
LINQとは
統合言語クエリ (LINQ) は、クエリ機能を C# 言語 (および Visual Basic や場合によってその他の .NET 言語) に直接統合する一連の技術の名前です。 LINQ を使用すると、クエリは、クラス、メソッド、イベントなどと同じように、高度な機能を備えた言語構成要素になります。
クエリを記述する開発者の場合、LINQ で最も違いを認識できる "統合言語" 部分はクエリ式です。 クエリ式は、C# 3.0 で導入された宣言クエリ構文で記述します。 クエリ構文を使用すると、データ ソースに対する複雑なフィルター処理、順序付け、およびグループ化の操作を最小限のコードで実行できます。 同じ基本的なクエリ式のパターンを使用して、SQL データベース、ADO.NET データセット、XML ドキュメントとストリーム、および .NET コレクション内のデータを照会および変換します。
完全なクエリ操作の例を次に示します。 完全な操作には、データ ソースの作成、クエリ式の定義、および foreach ステートメントでのクエリの実行が含まれます。