2020年09月17日
川俣晶の縁側ソフトウェアC# コーディング How To total 638 count

【入門級】1から100までの偶数の合計を【ループなし】で書く

Written By: 川俣 晶連絡先

ループなしで §

 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

COOL C# CREW

C#ハウツー連載の解説増量、カラーのソース、新規書き下ろし追加の読みやすい単行本はこちら。

C#ハウツー: 逆引き入門・こんな機能はどう書くの?