.NET Framework
ForEach
サーチ…
備考
それはまったく使用しますか?
.NETフレームワークの目的は、クエリに副作用がなく、 ForEach
メソッドが定義上副作用を引き起こすということです。代わりにプレーンなforeach
を使用すれば、コードをより保守しやすくテストしやすくなるかもしれません。
リスト内のオブジェクトのメソッドを呼び出す
public class Customer {
public void SendEmail()
{
// Sending email code here
}
}
List<Customer> customers = new List<Customer>();
customers.Add(new Customer());
customers.Add(new Customer());
customers.ForEach(c => c.SendEmail());
IEnumerableの拡張メソッド
ForEach()
はList<T>
クラスで定義されていますが、 IQueryable<T>
またはIEnumerable<T>
では定義されていません。これらのケースでは2つの選択肢があります。
最初にリストする
列挙(またはクエリ)が評価され、結果が新しいリストにコピーされるか、データベースが呼び出されます。次に、このメソッドが各項目に対して呼び出されます。
IEnumerable<Customer> customers = new List<Customer>();
customers.ToList().ForEach(c => c.SendEmail());
中間リストが作成されるので、このメソッドは明らかなメモリ使用量オーバーヘッドを持ちます。
拡張メソッド
拡張メソッドを書く:
public static void ForEach<T>(this IEnumerable<T> enumeration, Action<T> action)
{
foreach(T item in enumeration)
{
action(item);
}
}
つかいます:
IEnumerable<Customer> customers = new List<Customer>();
customers.ForEach(c => c.SendEmail());
注意:フレームワークのLINQメソッドは、 純粋であることを意図して設計されているため、副作用が生じません。 ForEach
メソッドの唯一の目的は、副作用を生成することであり、この側面では他のメソッドから逸脱しています。代わりに単純なforeach
ループを使用することもできます。
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow