用于将列表拆分为列表的递归函数

时间:2014-07-09 13:07:20

标签: c# linq

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

+-------------+---------------+-------------+
|     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   |
+-------------+---------------+-------------+

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

3 个答案:

答案 0 :(得分:4)

你并不总是需要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解决方案:)

答案 1 :(得分:1)

我不确定这是否优雅,但它使用的是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;
});

答案 2 :(得分:0)

Psuedo代码

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

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