【问题标题】:Recursive function to split list into list [duplicate]将列表拆分为列表的递归函数[重复]
【发布时间】:2014-07-09 13:07:20
【问题描述】:

我正在尝试解决以下问题,我有一个包含一些数据的集合:

+-------------+---------------+-------------+
|     Date    |  InitialValue |  FinalValue |
+-------------+---------------+-------------+
|  21.05.2003 | 0             | 382087.14   |
|  23.06.2003 | 408206.52     | 110622.79   |
|  19.07.2004 | 123811.34     | 0           |
|  31.12.2011 | 0             | 0           |
|  08.06.2012 | 0             | 501854.71   |
|  31.12.2012 | 501854.71     | 546208.19   |
|  31.12.2013 | 634535.58     | 666284.47   |
|  30.06.2014 | 666284.47     | 725837.32   |
|  08.07.2014 | 725837.32     | 729646.48   |
+-------------+---------------+-------------+

我需要做的是,当最终值等于0时,将这个列表拆分为多个列表。预期的结果应该是这样的:

结果列表 1

+-------------+---------------+-------------+
|     Date    |  InitialValue |  FinalValue |
+-------------+---------------+-------------+
|  21.05.2003 | 0             | 382087.14   |
|  23.06.2003 | 408206.52     | 110622.79   |
|  19.07.2004 | 123811.34     | 0           |
+-------------+---------------+-------------+

结果列表 2

+-------------+---------------+-------------+
|     Date    |  InitialValue |  FinalValue |
+-------------+---------------+-------------+
|  31.12.2011 |             0 |           0 |
+-------------+---------------+-------------+

结果列表 3

+-------------+---------------+-------------+
|     Date    |  InitialValue |  FinalValue |
+-------------+---------------+-------------+
|  08.06.2012 | 0             | 501854.71   |
|  31.12.2012 | 501854.71     | 546208.19   |
|  31.12.2013 | 634535.58     | 666284.47   |
|  30.06.2014 | 666284.47     | 725837.32   |
|  08.07.2014 | 725837.32     | 729646.48   |
+-------------+---------------+-------------+

谁能给我一个优雅的方法来解决我的问题?

【问题讨论】:

  • 你有没有尝试自己解决这个问题?
  • 我尝试过使用 takewhile,但这只是解决了第一次拆分。我考虑过使用 groupby,但我不知道如何以正确的方式对数据集进行分组
  • 这与stackoverflow.com/q/22847802/1549380 几乎是重复的。
  • 扎克谢谢你!我输入了正确的搜索,这就是我要找的!抱歉重复
  • @Zack Ah,单行 linq 解决方案。似乎和我的代码一样,但聚合起来很有趣。虽然老实说,我还是会坚持使用 for 循环以提高可读性。

标签: c# linq


【解决方案1】:

你并不总是需要 linq:

var List<Data> myData;
var List<List<Data>> mySplittedData;

mySplittedData.Add(new List<Data>());
foreach(var item in myData)
{
  mySplittedData.Last().Add(item);
  if(item.FinalValue == 0)
    mySplittedData.Add(new List<Data>());
}

应该可以工作,尽管我确信有人会想出一个聪明的单行 linq 解决方案 :)

【讨论】:

    【解决方案2】:

    我不确定这是否优雅,但它仍然使用 Linq:

    var result = items.Aggregate(new List<List<Item>> { new List<Item>() }, (list, value) =>
    {
        list.Last().Add(value);
        if (value.FinalValue == 0)
        {
            list.Add(new List<Item>());
        }
        return list;
    });
    

    【讨论】:

      【解决方案3】:

      伪代码

      while (more result) {
        list = input.Skip(n).TakeWhile(not 0)
        n += list.Count()
        use or store list
      }
      

      不是最优雅的,因为跳过将不得不多次跳过input 的第一个元素,但可能会让你开始。

      【讨论】:

        猜你喜欢
        • 2016-01-22
        • 2018-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-06
        • 2018-07-26
        相关资源
        最近更新 更多