该操作似乎是组合map(aka Select)和reduce(aka Aggregate)操作的弱版本,仅限于二进制操作.我们可以做得更好!
public static IEnumerable<R> MyAggregate<T, R>(
this IEnumerable<T> items,
R seed,
Func<T, R, R> mapper)
{
R current = seed;
foreach(T item in items)
{
current = mapper(item, current);
yield return current;
}
}
Run Code Online (Sandbox Code Playgroud)
现在你想要的功能只是一个特例:
static IEnumerable<int> PartialSum(this IEnumerable<int> items) =>
items.MyAggregate(0, (i, s) => s + i);
Run Code Online (Sandbox Code Playgroud)
评论者Tom Blodget指出,这要求总和操作具有一定的身份; 怎么没有呢?在这种情况下,您必须放弃使sum类型与summand类型不同的能力:
public static IEnumerable<T> PartialSum<T>(
this IEnumerable<T> items,
Func<T, T, T> sum)
{
bool first = true;
T current = default(T);
foreach(T item in items)
{
current = first ? item : sum(current, item);
first = false;
yield return current;
}
}
Run Code Online (Sandbox Code Playgroud)
你可以使用它
myints.PartialSum((i, s) => i + s);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
311 次 |
| 最近记录: |