for文で書いていた処理をLINQで書き直してみた話【C#】

C#

はじめに

C#で個人開発を進める中で、
データ処理といえば for / foreach 文 ばかり書いていた時期がありました。

もちろんそれでも動くのですが、
処理が少し複雑になってくると、

  • if が増える
  • 処理の流れを追いにくくなる
  • 後から見返したときに分かりづらい

と感じることが増えてきました。

そんなときに使い始めたのが LINQ です。
今回は、よくある処理を例に
for文で書いた場合と、LINQで書いた場合を比べてみた内容をまとめます。

LINQとは?(ざっくり)

LINQ(Language Integrated Query)は、
List などのコレクションを、宣言的に操作できる仕組みです。

といっても、
最初から全部覚える必要はありません。

個人開発で触っていて、
よく使うのは次のような処理です。

  • 条件で絞る
  • 必要な形に変換する
  • 合計や件数を出す

まずはこのあたりだけ分かっていれば十分だと感じています。

for文で書いた場合

例として、
「チェックがONになっているデータだけ、金額を合計したい」
という処理を考えてみます。

int total = 0;

foreach (var item in items)
{
    if (item.IsChecked)
    {
        total += item.Amount;
    }
}

処理の内容自体はシンプルで、
特に問題のない書き方です。

ただ、条件が増えてきたり、
似たような処理が増えてくると、
コード全体が少しずつ読みにくくなっていきます。

LINQで書き直してみる

同じ処理を LINQ で書くと、次のようになります。

int total = items
    .Where(item => item.IsChecked)
    .Sum(item => item.Amount);

やっていることは同じですが、

  • 条件で絞る
  • 合計する

という流れが、
コードの並びそのままで分かるようになります。

書き比べてみて感じた違い

読みやすさ

LINQは
「何をしたいのか」がコードにそのまま表れるため、
後から見返したときに理解しやすいと感じました。

修正のしやすさ

例えば条件を追加したい場合も、

.Where(item => item.IsChecked && item.Amount > 0)

のように、
1か所直すだけで済みます。

for文の場合は if が増えていくため、
修正箇所が分散しがちです。

ミスが入りにくい

foreach と変数の組み合わせでは、

  • 初期化忘れ
  • 加算処理の書き忘れ

といったミスが起きることもあります。

LINQでは
処理の型がある程度決まっているため、
こうしたヒューマンエラーが減る印象があります。

初心者のうちはここだけ使えばいい

LINQは機能が多いですが、
最初から全部覚える必要はないと思っています。

個人開発でよく使っているのは、次の3つです。

  • Where:条件で絞る
  • Select:必要な形に変換する
  • Sum / Count:集計する

まずは
「for文で書いていた処理を、1つだけLINQに置き換えてみる」
それくらいで十分だと感じています。

まとめ

LINQは
「for文を使わない方がいい」という話ではなく、
読みやすく、修正しやすくするための選択肢の1つだと思っています。

個人開発の中でも、
1か所LINQに置き換えるだけで
コードの見え方がかなり変わると感じました。

今後も、
書き比べながら少しずつ使いどころを増やしていく予定です。

次回予告

次は、
個人開発の中で使用頻度が高かったLINQだけをピックアップして、
もう少し具体的にまとめてみようと思います。