for WPF developers
Home Profile Tips 全記事一覧

Average 拡張メソッドで平均値を算出する

(2017/03/07 20:12:02 created.)

(2017/03/08 17:15:19 modified.)

Average 拡張メソッドで簡単に平均値を算出できます。

Program.cs
  1. namespace Tips_Linq
  2. {
  3.     using System;
  4.     using System.Linq;
  5.  
  6.     class Program
  7.     {
  8.         static void Main(string[] args)
  9.         {
  10.             var numbers = new int[] { 0, 1, 2 };
  11.             Console.WriteLine("コレクションの要素は {{ {0} }} です。", string.Join(", ", numbers));
  12.  
  13.             var ave1 = numbers.Average();
  14.             Console.WriteLine("平均値は {0} です。", ave1);
  15.  
  16.             var nullableNumbers = new int?[] { null, 1, 2 };
  17.             Console.WriteLine("コレクションの要素は {{ {0} }} です。", string.Join(", ", nullableNumbers));
  18.  
  19.             var ave2 = nullableNumbers.Average();
  20.             Console.WriteLine("平均値は {0} です。", ave2);
  21.  
  22.             Console.ReadKey();
  23.         }
  24.     }
  25. }


Average 拡張メソッドは int、long、float、double、decimal 型に対応しており、それぞれの null 許容型にも対応しています。null 許容型で要素が null の場合はその要素は無視されるため、要素数としてもカウントされずに平均値が算出されるようになっています。元の型が float、decimal 以外のときはすべて double 型の戻り値になります。

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

この Person クラスを使った人物情報コレクションに対して、平均年齢を算出するときは以下のようになります。

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.  
  13.             var ave = people.Average(x => x.Age);
  14.             Console.WriteLine("平均年齢は {0} です。", ave);
  15.  
  16.             Console.ReadKey();
  17.         }
  18.  
  19.         /// 
  20.         /// 人物コレクションの列挙子を取得します。
  21.         /// 
  22.         /// 
  23.         static IEnumerable<Person> GetPeople()
  24.         {
  25.             yield return new Person() { Name = "田中 淳平", Age = 37 };
  26.             yield return new Person() { Name = "鈴木 ほのか", Age = 26 };
  27.             yield return new Person() { Name = "小池 哲司", Age = 22 };
  28.             yield return new Person() { Name = "恩田 進", Age = 42 };
  29.             yield return new Person() { Name = "中津山 亜希子", Age = 20 };
  30.         }
  31.     }
  32. }