Categories: C#

C# 配列やListで任意の範囲を合計したり、平均出したり。

配列で、合計を出したければ Sum()、平均を出したければ Average() メソッドが便利ですが、配列の特定の範囲だけを対象にしたい場合。

Array.Copy()で任意の範囲を抜き出す

たとえば、次のように8つの要素がある配列の2番目から5つの要素の合計や、平均を求めたい場合、Array.Copy()を使って、一旦別の配列に抜き出してから、その配列を合計、平均すればいいです。

  int[] a = new int[] { 85, 76, 68, 79, 82, 65, 72, 74 };

 //int型の配列の合計
 int a_sum = a.Sum();

 //int型の配列の平均
 double a_avg = a.Average();

 
 //配列の1つ目から5つを抜き出す
 int[] b = new int[5];
 Array.Copy(a, 1, b, 0, 5);

 //抜き出したint型の配列の合計
 int b_sum = b.Sum();

 //抜き出したint型の配列の平均
 double b_avg = b.Average();

上の例では、Array.Copy(c, 1, d, 0, 5); で、List c の1つ目から配列のコピーを、bのはじめ(0)から5つ分配置する。ということになります。

List型ではCopyTo()で同様に処理できる

ところが、Array.Copy()はプリミティブ型(基本形)の配列しか扱えません。
でも、List型のようなCollection系の配列の場合、CopyTo()が使えるので同じように処理できます。

以下の例では、

  List c = new List { 85, 76, 68, 79, 82, 65, 72, 74 };

 //List型の合計
 int c_sum = c.Sum();

 //List型の平均
 double c_ave = c.Average();

 int[] d = new int[5];

 c.CopyTo(1, d, 0, 5);

 //抜き出したint型の配列の合計
 int d_sum = d.Sum();

 //抜き出したint型の配列の平均
 double d_avg = d.Average();

a.CopyTo(1, b, 0, 5); で、List a の1つ目から配列のコピーを、bのはじめ(0)から5つ分配置する。ということになります。

似てますけど、微妙に違うので混乱してしまいそうなのでメモ。

nakaike