for WPF developers
Home Profile Tips 全記事一覧

Count 拡張メソッドで要素数を数える

(2017/03/07 20:35:57 created.)

Count 拡張メソッドではある特定の条件を満たす要素数を数えます。次のような人物データを表す Person クラスを定義します。

Person.cs
  1. namespace Tips_Linq
  2. {
  3.     using System;
  4.  
  5.     /// <summary>
  6.     /// 人物データを表します。
  7.     /// </summary>
  8.     public class Person
  9.     {
  10.         /// <summary>
  11.         /// 氏名を取得または設定します。
  12.         /// </summary>
  13.         public string Name { get; set; }
  14.  
  15.         /// <summary>
  16.         /// 年齢を取得または設定します。
  17.         /// </summary>
  18.         public int Age { get; set; }
  19.     }
  20. }

この Person クラスを使った Count 拡張メソッドのコード例と実行結果を次に示します。

Program.cs
  1. namespace Tips_Linq
  2. {
  3.     using System;
  4.     using System.Collections.Generic;
  5.     using System.Linq;
  6.  
  7.     class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             var people = GetPeople();
  12.             foreach (var p in people)
  13.             {
  14.                 Console.WriteLine(p.Name + " (" + p.Age + ")");
  15.             }
  16.  
  17.             var count = people.Count();
  18.             var value = 30;
  19.             var elderThan = people.Count(x => x.Age > value);
  20.             Console.WriteLine("{0} 人中 {1} 人が {2} 歳より年上です。", count, elderThan, value);
  21.  
  22.             Console.ReadKey();
  23.         }
  24.  
  25.         /// <summary>
  26.         /// 人物コレクションの列挙子を取得します。
  27.         /// </summary>
  28.         /// <returns></returns>
  29.         static IEnumerable<Person> GetPeople()
  30.         {
  31.             yield return new Person() { Name = "田中 淳平", Age = 37 };
  32.             yield return new Person() { Name = "鈴木 ほのか", Age = 26 };
  33.             yield return new Person() { Name = "小池 哲司", Age = 22 };
  34.             yield return new Person() { Name = "恩田 進", Age = 42 };
  35.             yield return new Person() { Name = "中津山 亜希子", Age = 20 };
  36.         }
  37.     }
  38. }


Count 拡張メソッドに入力引数を何も与えない場合、シーケンス全体の要素数を数えます。入力引数に Func 型のメソッドを指定することで、指定されたメソッドで true が返ってくる要素のみの数を数えます。上記の例では各要素 Person クラスの Age プロパティが 30 より大きい場合のみ true を返すメソッドを指定しているため、変数 elderThan には 2 が代入されることになります。

Count 拡張メソッドで要素数を数えることで、そのシーケンスが空かどうかを判定することもできますが、特に要素数が多くなる可能性のあるシーケンスの場合は Any 拡張メソッドを使うことをお勧めします。Count 拡張メソッドを使用した場合、空シーケンスでない場合は全要素を数えるために要素数分だけループが発生するため、処理速度が落ちます。