ループなしで §
1から100までの偶数の合計を計算してみましょう。ただし、ループなしで書くという条件を付けましょう。
つまり、for/while/doを使いません。
できるでしょうか。
できます。
ポイントは何でしょうか。
ループなしで数字の列を発生させるEnumerable.Rangeメソッドです。
問題はいかにして偶数を得るかです。
作戦1 限定法 §
サンプルソースの作戦1は、偶数を得るために、Whereメソッドで偶数かどうかを判定しています。偶数だけ通せば合計(Sum())は偶数だけの合計です。
作戦2 加工法 §
サンプルソースの作戦2は、偶数を得るために、値を2倍しています。1から50の数字を2倍すれば、1から100までの偶数になるというアイデアです。パッと見て意図が分かりにくいですがソースが短くなります。
どちらを使うのかはあなたの判断次第です。
罠の数々 §
- Enumerable.Rangeメソッドは1つずつ増えていく値しか生成できないが、それを元にいろいろな値を計算で作り出せる。Selectメソッドを連結して値を加工してしまおう
- 20世紀の常識ではループを使う場面でも、ループなしで一発で書ける処理は割と多い。参考にする資料が古いと無駄なループを書かされるぞ。
参考リンク §
Enumerable.Range(Int32, Int32) メソッド
Enumerable.Where メソッド
Enumerable.Sum メソッド
Enumerable クラス
Enumerableクラスには便利なメソッドが他にも多いぞ。確認しておこう。特に、RepeatメソッドはRangeメソッドと並んで、値の列の生成に便利な双璧だ。
リポジトリ §
https://github.com/autumn009/cshowto
SumOneLine §
using System;
using System.Linq;
class Program
{
static void Main()
{
// 作戦1 限定法
Console.WriteLine(Enumerable.Range(1,100).Where(c => (c % 2) == 0).Sum());
// 作戦1 加工法
Console.WriteLine(Enumerable.Range(1, 50).Sum(c=>c*2));
}
}
実行結果
2550
2550