C# 中的 std::partial_sum 等价物是什么?
What is the std::partial_sum equivalent in C#?
在 C# 中,C++ 的最佳等价物是什么 std::partial_sum?
试试这个:
int[] values = new[] { 1, 2, 3, 4 };
var result = values.Select ((x, index) => values.Take (index + 1).Sum ());
结果:1, 3, 6, 10
但如果你关心性能,最好编写自己的方法。
编辑:
public static IEnumerable<T> MyAggregate<T> (this IEnumerable<T> items, Func<T, T, T> mapper)
{
bool processingFirstElement = true;
T accumulator = default (T);
foreach (T item in items)
{
if (processingFirstElement)
{
processingFirstElement = false;
accumulator = item;
}
else
{
accumulator = mapper (accumulator, item);
}
yield return accumulator;
}
}
现在:
int[] values = new int[] { 1, 2, 3, 4 };
var result = values.MyAggregate ((accumulator, item) => accumulator + item).ToList ();
该操作似乎是组合映射(又名 Select)和缩减(又名聚合)操作的弱版本,仅限于二元操作。我们可以做得更好!
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;
}
}
现在你想要的功能只是一个特例:
static IEnumerable<int> PartialSum(this IEnumerable<int> items) =>
items.MyAggregate(0, (i, s) => s + i);
评论者 Tom Blodget 指出,这要求求和运算具有恒等式;如果你没有呢?在那种情况下,您必须放弃使总和类型不同于被加数类型的能力:
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;
}
}
而且你可以使用它
myints.PartialSum((i, s) => i + s);
在 C# 中,C++ 的最佳等价物是什么 std::partial_sum?
试试这个:
int[] values = new[] { 1, 2, 3, 4 };
var result = values.Select ((x, index) => values.Take (index + 1).Sum ());
结果:1, 3, 6, 10
但如果你关心性能,最好编写自己的方法。
编辑:
public static IEnumerable<T> MyAggregate<T> (this IEnumerable<T> items, Func<T, T, T> mapper)
{
bool processingFirstElement = true;
T accumulator = default (T);
foreach (T item in items)
{
if (processingFirstElement)
{
processingFirstElement = false;
accumulator = item;
}
else
{
accumulator = mapper (accumulator, item);
}
yield return accumulator;
}
}
现在:
int[] values = new int[] { 1, 2, 3, 4 };
var result = values.MyAggregate ((accumulator, item) => accumulator + item).ToList ();
该操作似乎是组合映射(又名 Select)和缩减(又名聚合)操作的弱版本,仅限于二元操作。我们可以做得更好!
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;
}
}
现在你想要的功能只是一个特例:
static IEnumerable<int> PartialSum(this IEnumerable<int> items) =>
items.MyAggregate(0, (i, s) => s + i);
评论者 Tom Blodget 指出,这要求求和运算具有恒等式;如果你没有呢?在那种情况下,您必须放弃使总和类型不同于被加数类型的能力:
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;
}
}
而且你可以使用它
myints.PartialSum((i, s) => i + s);