使用 LINQ 和 C# 从列中重复减去行

Repeated subtraction of rows from a column using LINQ and C#

我想使用 LINQ 从我数据库中 table 的列中重复减去行。我的table如图

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 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

试试这个:

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.

不确定这是否是个好主意,但您可以在 C# 中尝试 LinkedList<T> class:

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}");

这个很简单。只得到 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 就是答案。