使用LINQ C#求和

时间:2019-03-13 12:47:40

标签: c# linq

我如何使用LINQ获得结果数组?

 int max = 500;
 int[] items = new[] {5, 7, 9, 1};

 int[] result = new[] {495, 488, 479, 478};


 //result[0] = max - items[0];
 //result[1] = result[0] - items[1];
 //result[2] = result[1] - items[2];
 //result[3] = result[2] - items[3];

没有LINQ,我可以做这样的事情:

for (int i = 0; i < items.Length; i++)
{
 if (i == 0)
    result[i] = max - items[i];
 else
    result[i] = result[i - 1] - items[i];
}

但是我不能理解,如何使用LINQ做到这一点 你有想法吗?

提前谢谢

3 个答案:

答案 0 :(得分:3)

这是一条linq语句,它将复制您在评论中所做的事情

const arr = [{
    "id": 1,
    "Size": 90,
    "Maturity": 24,
   },
   {
    "id": 2,
    "Size": 85,
    "Maturity": 22,
   },
   {
    "id": 3,
    "Size": 80,
    "Maturity": 20,
   }];

arr
  .map((item,index) => ({ ...item, Order: index + 1 }))
  .sort((a, b) => b.Maturity - a.Maturity)

答案 1 :(得分:2)

不幸的是,LINQ不提供这种类型的聚合。理想情况下,您希望使用循环为此编写自己的聚合函数。使用LINQ的不太干净的解决方案如下所示:

var results = new List<int>();
items.Aggregate(max, (agg, curr) => { var n = agg - curr; results.Add(n); return n;});

这不是干净的,因为我们不想使用LINQ来产生副作用,而主要是作为PURE函数。

使用汇总扩展名进行了更新,以提供更好的方法

static class Extensions {
    public static IEnumerable<TAccumulate> AggregateExtn<TSource, TAccumulate>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func) {
        TAccumulate result = seed;
        foreach (TSource element in source) {
            result = func(result, element);
            yield return result;
        }
    }
}

您可以按以下方式调用它

var results = items.AggregateExtn(max, (agg, curr) => agg - curr);

答案 2 :(得分:2)

您可以使用以下内容。

var result = items.Select(x => max -= x);

完整代码

 int max = 500;
 int[] items = new[] {5, 7, 9, 1};
 var result = items.Select(x => max -= x).ToArray();

输出

495 
488 
479 
478