Linqはすごいと信じ込まされているあなた以下のプログラムを見てください。
あなたが自分でプログラムを書くとして cal2 と cal3 + Extensionクラス のどちらを書きますか?
過去のシリーズ
Linqはすごい? その2
Linqはすごい? その1
static int[] cal2(int[] arr)
{
int sum = 0;
int count = 0;
int max = int.MinValue;
int min = int.MaxValue;
foreach (int a in arr)
{
sum += a;
count++;
if (max < a) max = a;
if (min > a) min = a;
}
return new int[] { sum, count, max, min };
}
static int[] cal3(int[] arr)
{
return new int[] {
arr.ExSum(),
arr.ExCount(),
arr.ExMax(),
arr.ExMin()
};
}
public static class Extension
{
public static int ExSum(this IEnumerable<int> source)
{
if (source == null) throw new ArgumentNullException("source");
int sum = 0;
foreach (int value in source) sum += value;
return sum;
}
public static int ExCount(this IEnumerable<int> source)
{
if (source == null) throw new ArgumentNullException("source");
int count = 0;
foreach (int value in source) count ++;
return count;
}
public static int ExMax(this IEnumerable<int> source)
{
if (source == null) throw new ArgumentNullException("source");
int max = 0;
bool flag = false;
foreach (int value in source)
{
if (flag)
{
if (value > max) max = value;
}
else
{
max = value;
flag = true;
}
}
if (!flag) throw new InvalidOperationException("NoElements");
return max;
}
public static int ExMin(this IEnumerable<int> source)
{
if (source == null) throw new ArgumentNullException("source");
int min = 0;
bool flag = false;
foreach (int value in source)
{
if (flag)
{
if (value < min) min = value;
}
else
{
min = value;
flag = true;
}
}
if (!flag) throw new InvalidOperationException("NoElements");
return min;
}
}
#throw に new を入れ忘れていました。
#元コードから手で修正した部分です。
#指摘ありがとうございました。