Yuta.NET

C#のリストや配列のデータを元に条件を付けてカウント(件数)を取得する小技


リストや配列のデータを元に条件を付けてカウント(件数)を取得するだけならforeach文やwhile文などのループは不要です。Linqを使ってお手軽に取得する小技を紹介しますので上手く応用して可読性を上げよう!!

但し、Linqは.NET3.5以上からです。裏技はあるようですがおススメはしません。無用なトラブルを避けるため、また、良い機能の恩恵を受けるため素直に.NETのバージョンを上げる努力をしましょう。

まずは単純にリストや配列のカウント(件数)を取得するだけのメソッドです。


Console.WriteLine("総人数:{0}人", people.Count());

次に条件を付けてリストや配列のカウント(件数)を取得するメソッドです。たったの一行で済みます。foreach文やwhile文などのループは要りません。


Console.WriteLine("20歳以上:{0}人", people.Count(x => x.Age >= 20));

さらに応用です。条件はANDやORで複数の指定を行うことが可能です。


Console.WriteLine("20歳以上の女性:{0}人", people.Count(x => x.Age >= 20 && x.Sex == SEX.Female));

上記の全文を記載しています。


using System;
using System.Collections.Generic;
using System.Linq;

namespace YutaCore.ConsoleApp1
{
    /// <summary>
    /// 性別
    /// </summary>
    public enum SEX
    {
        /// <summary>
        /// その他
        /// </summary>
        Other = 0,
        /// <summary>
        /// 男性
        /// </summary>
        Male,
        /// <summary>
        /// 女性
        /// </summary>
        Female,
    }

    /// <summary>
    /// 個人情報
    /// </summary>
    public class human
    {
        /// <summary>
        /// 
        /// </summary>
        public string Sei { set; get; }
        /// <summary>
        /// 
        /// </summary>
        public string Mei { set; get; }
        /// <summary>
        /// 氏名
        /// </summary>
        public string Name { get { return (Sei + " " + Mei).Trim(); } }
        /// <summary>
        /// 性別
        /// </summary>
        public SEX Sex { set; get; }
        /// <summary>
        /// 年齢
        /// </summary>
        public int Age { set; get; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            IEnumerable<human> people = new List<human> {
                  new human() { Sei = "Sato"    , Mei = "Mei"   , Sex = SEX.Female, Age = 10 }
                , new human() { Sei = "Suzuki"  , Mei = "Haruto", Sex = SEX.Male  , Age = 15 }
                , new human() { Sei = "Takahasi", Mei = "Himari", Sex = SEX.Female, Age = 20 }
                , new human() { Sei = "Tanaka"  , Mei = "Sota"  , Sex = SEX.Male  , Age = 25 }
                , new human() { Sei = "Ito"     , Mei = "Hana"  , Sex = SEX.Female, Age = 30 }
            };

            Console.WriteLine("総人数        :{0}人", people.Count());
            Console.WriteLine("20歳以上      :{0}人", people.Count(x => x.Age >= 20));
            Console.WriteLine("20歳以上の女性:{0}人", people.Count(x => x.Age >= 20 && x.Sex == SEX.Female));
            Console.ReadKey(true);
        }
    }
}