使用 LINQ 和 C# 从列中重复减去行
本文关键字:LINQ 使用 | 更新日期: 2023-09-27 18:18:30
我想使用 LINQ 从数据库中的表中的列中反复减去行。我的表如图所示
ID Numbers
1 488
2 612
3 803
4 1082
5 1310
6 1586
7 1899
我想取612
并用488
减去它并存储值。
然后取803
并用612
减去并存储值。
对每个数字执行此操作
1082 - 803
1310 - 1082
1586 - 1310
1899 - 1586
最后,我想对获得的值求和。
是否有我可以使用的特定功能?我尝试使用 for 循环,但我似乎无法设法将这些部分放在一起以使其工作。有人可以帮忙吗?
试试这个:
var numbers = new []
{
488, 612, 803, 1082, 1310, 1586, 1899,
};
var deltas = numbers.Skip(1).Zip(numbers, (n1, n0) => n1 - n0);
var sum = deltas.Sum();
这给出了:
124
191
279
228
276
313
与1,411
之和.
这很简单。只需获得item - previous item
的总和
private int GetSumOfSubtractions(int[] numbers)
{
if (numbers.Length == 0) return 0;
if (numbers.Length == 1) return numbers[0];
int sum = 0;
for (int i = 1; i < numbers.Length; i++)
{
sum += numbers[i] - numbers[i - 1];
}
return sum;
}
这背后的一点数学。
612 - 488 + 803 - 612 + 1082 - 803 + 1310 - 1082 + 1586 - 1310 + 1899 - 1586
^ ^^ ^ ^^
如您所见,中间数字相互抵消并变为 0,只剩下第一项和最后一项。
所以答案1899-488
。
var array = new []{ 488, 612, 803, 1082, 1310, 1586, 1899 };
var results=array.Last()-array.First();
更新:
您的问题可以简化为上述内容。 它将给出正确的答案,因为 (x2-x1(+(x3-x2(+(x4-x3(+(x5-x4(+(x6-x5(+(x7-x6( 可以简化为 -x1+x7 或 x7-x1。
给定您的原始样本集,答案是1,411
。
如果你想做很长的路,你可以这样做:
var array = new []{ 488, 612, 803, 1082, 1310, 1586, 1899 };
var results=array.Skip(1).Select((e,i)=>e-array[i]).Sum();
您也可以这样做:
var array = new []{ 488, 612, 803, 1082, 1310, 1586, 1899 };
var results=array
.Aggregate(new {prev=array.First(),sum=0}, // Initialize
(last,current)=>new {prev=current,sum=last.sum+current-last.prev}, // Repeat
c=>c.sum); // Finalize
不确定这是否是一个好主意,但您可以在 C# 中尝试LinkedList<T>
类:
var numbers = new LinkedList<int>(new[]
{
488, 612, 803, 1082, 1310, 1586, 1899
});
var sum = 0;
var node = numbers.First;
while (node.Next != null)
{
var cur = node;
node = node.Next;
Console.WriteLine(node.Value - cur.Value);
sum += node.Value - cur.Value;
}
Console.WriteLine("********************");
Console.WriteLine($"Sum is : {sum}");