Linq & IEnumerable (& IQueryable) インターフェイスの背後にある考え方を理解する必要があります。IEnumerable はシーケンスの遅延読み込みに使用されるため、次のようなループの拡張メソッドを作成すると:
public static IEnumerable<T> LazyForEach<T>(this IEnumerable<T> source, Action<T> action) //action to perform
{
if (action == null) throw new ArgumentNullException("action");
foreach (T element in source)
{
action(element);
yield return element;
}
}
IEnumerable を返すメソッド (Linq) チェーンで LazyForEach を使用してみてください。
db.People.Where(p=>p...).LazyForEach(p=>
{
MessageBox.Show(p.ToString());
});
提供されたアクションのコードは、ToList/ToArray/ElementAt/First/Last/Any/Take/Skip で列挙を強制するまで (おそらく部分的に) 実行されません ... または alt を作成できます。拡大:
public static IEnumerable<T> ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
if (source == null)
return null;
if (action == null) throw new ArgumentNullException("action");
//var sourceList = source.ToList(); //forcing enumeration
var sourceList = new List<T>();
foreach (var element in source)
{
action(element);
sourceList.Add(element);
}
return sourceList;
}