是否有使用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