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

时间:2015-10-20 03:25:57

标签: c# linq linq-to-sql sum subtraction

我想使用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循环,但我似乎无法将各个部分放在一起以便它能够正常工作。有人可以帮忙吗?

4 个答案:

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