我正在尝试解决以下问题,我有一个包含一些数据的集合:
+-------------+---------------+-------------+
| 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 |
+-------------+---------------+-------------+
有人能给我一个优雅的方法来解决我的问题吗?
答案 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
的第一个元素,但可能会让你开始。