2016/06/28

[C#]要素をすべて掛ける(乗算する)

このエントリーをはてなブックマークに追加
要素をすべて乗算したかったんです。
すべて足し合わせるのは、Sumを使えばいいのですがLINQには乗算はありません。すべて掛けるなんて、あんまり使わないしね。
ExcelにはPRODUCT関数というのがあるらしく、値の積を計算するもののようです。このキーワードを知っていたら手早く探せたかも…。

Aggregateを使う

掛けるときはAggregateを使うとスマートでした。

int product = list.Aggregate((now, next) => now * next);

Aggregateコードは、LINQを使わずに展開すると下のコードと同じものです。

int next = 1;
foreach (int now in list) {
    next *= now;
}
int product = next;


めでたしめでたし。


サンプルソース


int[] list = { 1, 2, 3, 4 };

// すべて足す
int sum = list.Sum();
Console.WriteLine(sum); // 10

// すべて掛ける
int p = 1;
foreach (int val in list) {
    p *= val;
}
Console.WriteLine(p); // 24

// すべて掛ける
int product = list.Aggregate((now, next) => now * next);
Console.WriteLine(product); // 24

機会があったら覚えていくスタンス

さて、余談ですがAggregateはMSDNでは次のように説明されています。

Aggregate<TSource>(IEnumerable<TSource>, Func<TSource, TSource, TSource>)
シーケンスにアキュムレータ関数を適用します。

なんのこっちゃ、ぜんぜんわかりません。
LINQは使い方を知れば便利そうと解るけれど、インテリセンスやMSDNからの習得は難しいものもあるようです。
サンプルのコードがあって、こういう風に使うんだという一例があれば、なんとなくわかるし習得も容易ですね。

日頃よく使わないメソッドはやっぱりその挙動にも不安が残るものです。何度も検証しないと手放しで任せられないし、乗算のコードに展開したものを書いても、そんな目くじらを立てるほどのロスがあるわけでもありません。
意地でも新しいことを覚えないというスタンスはどうかと思いますが、片っ端から習得しようとしてもほとんどは出番がなく使わないままなのが現実です。
なので、機会があったら覚えていこうというくらいでいいかなと。

もちろんそのすべてを習得して自在に連携している人もいるでしょうし、それが理想モデルです。
けれど、自在に扱える人も右往左往しながら習得したはずですよ。

以上です。よきLINQライフを!

Calculate product with LINQ
http://stackoverflow.com/questions/252333/calculate-product-with-linq

0 件のコメント :

コメントを投稿