つかさラボのBlog@hatena

技術系ブログのはず

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 ステートメントでのクエリの実行が含まれます。

LINQ クエリ式 (C# プログラミング ガイド)より