【问题标题】:Get all items in list until cumulative sum reaches a limit value [duplicate]获取列表中的所有项目,直到累积总和达到限制值[重复]
【发布时间】:2019-10-28 07:00:44
【问题描述】:

我有一个List<Tuple<DateTime, double>>。此列表保证按日期时间排序。现在我想获取包含在累积总和中的所有项目,直到达到限制值。最优雅的方法是什么?

DateTime             | double     | c. sum   | Limit | in result list?
-----------------------------------------------------------------------
2019-10-28 07:51:10  | 0.3        | 0.3      | 5     | yes
2019-10-28 07:51:11  | 0.2        | 0.5      | 5     | yes
2019-10-28 07:51:12  | 0.7        | 1.2      | 5     | yes
2019-10-28 07:51:13  | 0.67       | 1.87     | 5     | yes
2019-10-28 07:51:14  | 1.0        | 2.87     | 5     | yes
2019-10-28 07:51:15  | 0.1        | 2.97     | 5     | yes
2019-10-28 07:51:16  | 0.9        | 3.87     | 5     | yes
2019-10-28 07:51:17  | 0.32       | 4.19     | 5     | yes
2019-10-28 07:51:18  | 0.21       | 4.40     | 5     | yes
2019-10-28 07:51:19  | 0.25       | 4.65     | 5     | yes
2019-10-28 07:51:20  | 0.6        | 5.25     | 5     | yes (more values don't need to be calculated, limit is reached)
-----------------------------------------------------------------------
2019-10-28 07:51:21  | 0.4        | 5.65     | 5     | no

提前感谢您的帮助。

【问题讨论】:

标签: c# aggregate-functions generic-list cumulative-sum


【解决方案1】:

我想我会这样做:

var list = new List<Tuple<DateTime, double>>
{
    ....
};

var sum = 0d;
var limit = 10d;

var result = list.TakeWhile(x => (sum += x.Item2) < limit).ToList();

【讨论】:

    【解决方案2】:

    我认为TakeWhile 可能是这里的不错人选。

    var list = new []{1,2,3,4};
    
    var sum1 = 0;
    var triggerValue = 6;
    var afterSumReached = list.TakeWhile( x => { sum1 += x; return sum1 <= triggerValue; } );
    // first 3 elements.
    

    var sum2 = 0;
    var beforeSumReached = list.TakeWhile( x => { 
        if( sum2 + x >= triggerValue) return false;
        sum2+=x; 
        return true;
    });
    // first 2 elements 
    
    

    【讨论】:

      【解决方案3】:

      您可以编写如下扩展方法:

      public static class ListTupleExtension
      {
          public static List<Tuple<DateTime, double>> CumulativeSum(this List<Tuple<DateTime, double>> sequence, double limit)
          {
              List<Tuple<DateTime, double>> result = new List<Tuple<DateTime, double>>();
              double sum = 0;
              foreach(var item in sequence)
              {
                  if (sum <= limit)
                  {
                      sum += item.Item2;
                  }
      
                  result.Add(new Tuple<DateTime, double>(item.Item1, sum));
              }
      
              return result;
          }
      }
      

      然后在列表中调用它为

      list = list.CumulativeSum(limit);
      

      查看this dotnetfiddle,它演示了用法。

      【讨论】:

      • 感谢您的提示。我纠正了实施中的两个小错误。在 Fiddler 示例中也可以看到这些(结果中有两个多项目,行的原始值也很重要)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 2021-02-28
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      • 2016-12-10
      相关资源
      最近更新 更多