LoginSignup
11
10

More than 5 years have passed since last update.

LINQって便利だけど考えて使わないといけない(戒め)

Last updated at Posted at 2017-11-27

LINQって最高だと思う

初投稿になります。間違いや勘違いがあればご指摘いただけましたら幸いです。

c#を書き出して一年程度なのですが、LINQってすごく便利だなと感じております。

LINQを多少使えるようになったばかりのころは
使えるところでは極力使えるようにしていました。

その際に職場の上司に指摘されたことを書きたいと思います。

それLINQ使わなかったら1回のループですむよね?

たとえばdoubleのリストから最大値、最小値、平均値を求めたい場合

List<double> doubleList = "doubleのList";
//1回目ループ
var max = doubleList.Max();
//2回目ループ
var min = doubleList.Min();
//3回目ループ
var average = doubleList.Average();

みたいな取り方をしていたのですが、
これは3回ループしています。

下記ならば1回のループで済みます。

List<double> doubleList = "doubleのList";
var max = double.NaN;
var min = double.NaN;
double sum = 0;
// ここで1回すだけ
foreach (double d in doubleList)
{
    if (double.IsNaN(max) || max < d)
        max = d;
    if (double.IsNaN(min) || min > d)
        min = d;
    sum += d;
}
var average = sum / doubleList.Count();

上記のソースでNaNチェックを毎回することを考えると

List<double> doubleList = "doubleのList";
// NaNチェックを避けるため1つ目の値をいれておく
var max = doubleList.First();
var min = doubleList.First();
double sum = 0;
// ここで1回すだけ
foreach (double d in doubleList)
{
    if (max < d)
        max = d;
    if (min > d)
        min = d;
    sum += d;
}
var average = sum / doubleList.Count();

みたいな書き方したほうがいいと思います。

もちろんデータの数が1000件とかならLINQの方が簡潔でいいと思いますが、
何百万件、何千万件というデータを扱う場合は気を付けようと思います。

でもこれってどれぐらいの件数からLINQを使うべきでないのかのラインって
計測してみないとわからないですね。
また、休日にでも計測してみたいと思います。

11
10
17

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
10