Iterator in aggregate(linq)?

q8l4jmvw  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(125)

假设我有一个像这样的小整数数组:

{10,20,30}

字符串
现在,对于该数组的项目,我想应用以下公式:

10^(arrayLenght-1) + 20^{arrayLenght-2) + 30^{arrayLenght-3}


有没有一种方法可以通过使用linq聚合方法来实现这一点,尽管你需要某种迭代器,当我看到这一点时,聚合不会实现?

ghhaqwfi

ghhaqwfi1#

我会这么做

array.Select((num, index) => Math.Pow(num, items.Length - index - 1)).Sum();

字符串

ztyzrc3y

ztyzrc3y2#

试试这个:

var a = new int[]{10, 20, 30};
int i = 0;
a.Sum(x => Math.Pow(x, a.Length - ++i));

字符串
它使用Sum方法,因为它在这里更准确。
您还可以使用:用途:

var a = new int[]{10, 20, 30};
a.Select((x,i)=> Math.Pow(x,a.Length-(i+1)));

efzxgjgh

efzxgjgh3#

您可以尝试对选择的结果求和,而不是使用聚合

result = values.Select((t, index) => Math.Pow(t, (values.Length - (index + 1)))).Sum();

字符串

8fsztsew

8fsztsew4#

给出的答案是解决这个问题的最佳选择,但是如果你需要一个公开迭代索引的聚合函数,你可以自己编写。

public static TAccumulate Aggregate<TSource, TAccumulate>(
    this IEnumerable<TSource> source,
    TAccumulate seed,
    Func<TAccumulate, TSource, int, TAccumulate> func)
{
    if (source == null)
        throw new ArgumentNullException(nameof(source));

    if (func == null)
        throw new ArgumentNullException(nameof(func));

    var accumulate = seed;
    var i = 0;
    foreach (var item in source)
    {
        accumulate = func(accumulate, item, i);
        i++;
    }
    return accumulate;
}

字符串

相关问题