我想使用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循环,但我似乎无法将各个部分放在一起以便它能够正常工作。有人可以帮忙吗?
答案 0 :(得分:2)
试试这个:
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
。
答案 1 :(得分:0)
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
答案 2 :(得分:0)
这很简单。只需获得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
就是答案。
答案 3 :(得分:-1)
不确定这是不是一个好主意,但您可以在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}");