サーチ…


備考

それはまったく使用しますか?

.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