是否有使用IEnumerable
擴展Select(或任何其他IEnumerable
擴展) 執行ForEach()
返回枚舉相當於一種方式?即,您是否可以使用內置的擴展IEnumerable
擴展名,這與自定義擴展名相同?淨可枚舉擴展執行的行動並返回相同的枚舉
public static class EnumerableExtensions
{
public static IEnumerable<T> Do<T>
(this IEnumerable<T> source, Action<T> action)
{
foreach (var elem in source)
{
action(elem);
yield return elem;
}
}
}
對於下面的評論,這個方法與調用foreach不完全一樣。在foreach的情況下,枚舉不返回。在這種情況下,施工的目的只是爲了執行這個動作,所以它很難被稱爲副作用。
它允許操作的鏈接,如
var Invoices = GetUnProcessedInvoices();
Invoices.Where(i=>i.Date > someDate)
.Do(i=>SendEmail(i.Customer))
.Do(i=>ShipProduct(i.Customer, i.Product, i.Quamtity))
.Do(i=>Inventory.Adjust(i.Product, i.Quantity));
或許不會,因爲'行動(ELEM);副作用'惡臭。 –
確實;如果有的話,它將是一個'Func()'而不是'Action';然後你可以用'Select()'來使用它。 –
[LINQ設計者主動選擇不包含這種方法。](http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx)這完全相反「LINQ」的整個設計。只需使用'foreach'循環。 – Servy