我如何使用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做到这一点 你有想法吗?
提前谢谢
答案 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