C#
定石3: IEnumerable<T> —遅延評価・LINQの基本型
出典: C# のコレクション選び — 配列 / List / IEnumerable / IList の使い分け完全ガイド — 定石3: IEnumerable<T> —遅延評価・LINQの基本型
// ✅定石3: IEnumerable<T>と遅延評価
public IEnumerable<CustomerVm> GetActiveCustomers()
{
return _db.Customers
.Where(c => c.Status == "active")
.Select(c => new CustomerVm { Id = c.Id, Name = c.Name });
// ↑この時点ではSQLはまだ発行されない(遅延評価)
}
//呼び出し側
var customers = GetActiveCustomers();
// 1回目のforeachで初めてSQL発行
foreach (var c in customers)
{
Console.WriteLine(c.Name);
}
// ⚠️ 2回目のforeachで同じSQLがもう一度発行される!
foreach (var c in customers)// ← 2回目のSQL発行
{
Logger.Info(c.Name);
}
// ✅対策: ToList()で具体化して持ち回す
var customerList = GetActiveCustomers().ToList(); //この時点でSQL 1回
foreach (var c in customerList){ /* 1回目 */ }
foreach (var c in customerList){ /* 2回目(SQL再発行なし)*/ }
▸ 実行ボタンで結果を表示
Source収録記事
この snippet は記事の「定石3: IEnumerable<T> —遅延評価・LINQの基本型」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
4 件// ✅定石1:配列T[] の基本 int[] daysInMonth = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; string[] weekDays = new string[7] { "月", "火", "水", "木", "金", "土", "日" };未収録
定石1:配列T[] —固定長・最速だがAPIでは出番が絞られる
#30be80acb5d1
// ✅定石2: List<T>の基本 var customers = new List<CustomerVm>(); //追加未収録
定石2: List<T> —可変長・最も多用される実装型
#a559247150e8
// ✅定石4: IList<T>をメソッド引数で受ける public void ProcessCustomers(IList<CustomerVm> customers) { //インデックスアクセス未収録
定石4: IList<T> —メソッド引数の汎用型
#3ab6caaff422
// ✅定石5:共変(covariance)の例 class Animal { } class Dog : Animal { }未収録
定石5:共変・反変の罠— IEnumerable<T>は共変・IList<T>は不変
#9af670d7acd0
