Yuta.NET

C#のリストや配列のデータを元に条件を付けて平均値を取得する小技


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

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

まずは単純にリストや配列の平均値を取得するだけのメソッドです。


Console.WriteLine("平均年齢:{0}", people.Average(x => x.Age));

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


Console.WriteLine("女性の平均年齢:{0}", people.Where(x => x.Sex == SEX.Female).Average(x => x.Age));

Math.Roundメソッドを使って小数点第一位で四捨五入を行っています。


Console.WriteLine("女性の平均年齢:{0}", Math.Round(people.Where(x => x.Sex == SEX.Female).Average(x => x.Age), 1));

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


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 = 13 }
                , new human() { Sei = "Suzuki"  , Mei = "Haruto", Sex = SEX.Male  , Age = 15 }
                , new human() { Sei = "Takahasi", Mei = "Himari", Sex = SEX.Female, Age = 19 }
                , new human() { Sei = "Tanaka"  , Mei = "Sota"  , Sex = SEX.Male  , Age = 24 }
                , new human() { Sei = "Ito"     , Mei = "Hana"  , Sex = SEX.Female, Age = 27 }
            };

            Console.WriteLine("平均年齢      :{0}", people.Average(x => x.Age));
            Console.WriteLine("女性の平均年齢:{0}", people.Where(x => x.Sex == SEX.Female).Average(x => x.Age));
            Console.WriteLine("女性の平均年齢:{0}", Math.Round(people.Where(x => x.Sex == SEX.Female).Average(x => x.Age), 1));
            Console.ReadKey(true);
        }
    }
}