はじめに
前回は、for文で書いていた処理をLINQに置き換えてみた話を書きました。
今回は、個人開発を進める中で
実際に使用頻度が高かったLINQメソッドをまとめてみます。
LINQは機能がとても多いですが、
正直なところ、全部を使いこなしているわけではありません。
よく使うものは、意外と限られています。
① Where:条件で絞る
一番よく使うのがWhereです。
var checkedItems = items
.Where(x => x.IsChecked)
.ToList();やっていることはとてもシンプルで、
- 条件に合うものだけ取り出す
それだけです。
個人開発では、
- チェックがONのデータ
- 有効フラグが立っているデータ
- 特定カテゴリのデータ
などを取り出す場面でよく使っています。
② Select:形を変える
Selectは、データの形を変えるときに使います。
var names = items
.Select(x => x.Name)
.ToList();この例では、
オブジェクトの一覧 → 名前だけの一覧
に変換しています。
表示用データを作るときや、
必要な項目だけを取り出したいときに便利です。
③ Sum / Count:集計する
集計系も使用頻度が高いです。
int total = items.Sum(x => x.Amount);
int count = items.Count();「ループして足し合わせる」よりも、
- 合計する
- 件数を出す
という意図がはっきりします。
Whereと組み合わせることも多いです。
int total = items
.Where(x => x.IsChecked)
.Sum(x => x.Amount);④ FirstOrDefault:最初の1件を取得する
特定の条件に合う最初のデータを取得したい場合に使います。
var target = items
.FirstOrDefault(x => x.Id == targetId);該当データがない場合はnullになるため、
nullチェックは忘れないようにしています。
if (target != null)
{
// 処理
}⑤ Any:存在チェック
「1件でも存在するか?」を確認する場合に使います。
bool exists = items.Any(x => x.IsChecked);foreachでフラグを管理するよりも、
「存在するかどうか」という意図がそのまま伝わります。
ToListを使う理由
LINQを書いていると、最後にToList()を付けることがあります。
var checkedItems = items
.Where(x => x.IsChecked)
.ToList();なぜToList()を付けるのかというと、
その時点のデータを確定させたいからです。
LINQはすぐに実行されない
例えば、次のように書いた場合
var query = items.Where(x => x.IsChecked);この時点では、まだ実際の処理は実行されていません。
LINQは、結果を実際に使うタイミングで評価される仕組みになっています。
ToListで「今の状態」を固定する
var checkedItems = items
.Where(x => x.IsChecked)
.ToList();こう書くことで、
- その瞬間のデータを
- Listとして確定させる
ことができます。
個人開発では、
- 後から元のリストが変更される可能性があるとき
- 複数回使い回すとき
- デバッグで中身を確認したいとき
などにToList()を使うことが多いです。
毎回ToListが必要なわけではない
逆に、毎回ToList()を付ける必要があるわけではありません。
例えば、結果を一度だけ使う場合や、
そのままSum()やCount()のような集計メソッドを続けて呼ぶ場合は、
無理にToList()を挟まなくても問題ありません。
int total = items
.Where(x => x.IsChecked)
.Sum(x => x.Amount);このように、LINQはつなげて書くことができます。
一度しか使わない処理であれば、
わざわざ List に変換しなくても、
そのまま最後まで書く方がシンプルです。
「今すぐリストとして確定させたいときだけ ToList() を使う」
くらいのイメージで考えると分かりやすいと思います。
まとめ
LINQは機能が多いですが、
まずは次のあたりだけでも十分だと感じています。
- Where
- Select
- Sum
- Count
- FirstOrDefault
- Any
個人開発の中でも、
このあたりを使うだけでコードはかなり整理されました。
無理に全部覚えようとせず、
「使いながら少しずつ増やしていく」くらいが
ちょうどいいと感じています。
次回予告
次は、
LINQでやらかしやすいポイントについてまとめる予定です。
- First と FirstOrDefault の違い
- nullの扱い
- ToListの使いすぎ
- チェーンしすぎて読みにくくなる問題
など、少し踏み込んだ内容を書いてみようと思います。
