使用 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 循环,但我似乎无法设法将这些部分放在一起以使其工作。有人可以帮忙吗?

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

试试这个:

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