【问题标题】:Repeated subtraction of rows from a column using LINQ and C#使用 LINQ 和 C# 从列中重复减去行
【发布时间】:2015-10-20 03:25:56
【问题描述】:

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

ID       Numbers

1         488  
2         612 
3         803 
4        1082 
5        1310 
6        1586 
7        1899 

我想将612488 相减并存储该值。

然后将803612 相减并存储该值。

对每个数字都这样做

1082 - 803

1310 - 1082

1586 - 1310

1899 - 1586 

最后我想对获得的值求和。

有没有我可以使用的特定功能?我尝试过使用 for 循环,但我似乎无法将各个部分组合在一起以使其正常工作。有人可以帮忙吗?

【问题讨论】:

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


    【解决方案1】:

    试试这个:

    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

    【讨论】:

      【解决方案2】:

      这很简单。只需得到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】:
        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
        

        【讨论】:

        • downvoters 必须在数学考试中获得 0 分。抱歉,但有一段时间我也认为这不是答案。请稍微解释一下!
        • @M.kazemAkhgary 不幸的是,但我发现那些在没有评论的情况下投反对票的人通常不理解这个问题。如果您要否决答案,我真的希望 SO 会强制发表评论。
        • 这应该被标记为答案。这个解决方案真的很简短。
        【解决方案4】:

        不确定这是否是个好主意,但您可以尝试 C# 中的 LinkedList&lt;T&gt; 类:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-17
          • 1970-01-01
          相关资源
          最近更新 更多