分裂List< SomeObject>到几个子列表
本文关键字:几个 列表 List SomeObject 分裂 | 更新日期: 2023-09-27 18:13:36
我有一个数组List<SomeObject>
,其中包含日期的升序(和一些更多的字段与info)。该列表将被分组为List<List<SomeObject>>
,与我的主题相关。
一个List<SomeObject>
组成一个List<List<SomeObject>>
。在前一种情况下,只包含一行。
一些计算发生在该行的LastOrDefault和FirstOrDefault上。(最后,该方法返回一个带有日期、类型和计算值的SomeObject)。
List<List<SomeObject>> Array; // Should be filled with the grouped List<SomeObject>
List<SomeObject> // One SomeObject is a row below,
2011-01-01 enumType.Ok 140.0
2011-01-02 enumType.Ok 210.0
2011-01-03 enumType.Ok 250.0
2011-01-04 enumType.Blocking 310.0
2011-01-05 enumType.Ok 4.0
2011-01-06 enumType.Ok 34.0
2011-01-07 enumType.Ok 93.0
and counting..
数组中的每一行都有一个类型(enum),通常为"Ok"。
这个数组可以出现"NotOk"而不是"Ok"(简化描述)。
问题是,
行2011-01-05有NotOk
,它必须分割数组。结果如下所示。所有行在一个数组中阻塞,然后下一个数组的其余行(或下一个"阻塞"点)。
List<SomeObject>
2011-01-01 enumType.Ok 140.0
2011-01-02 enumType.Ok 210.0
2011-01-03 enumType.Ok 250.0
2011-01-04 enumType.Blocking 310.0
List<SomeObject>
2011-01-05 enumType.Ok 4.0
2011-01-06 enumType.Ok 34.0
2011-01-07 enumType.Ok 93.0
and counting..
然后我可以对每个列表执行单独的groupby/计算sum,最后将每个groupby求和。
[编辑]
我得到了来自BrokenGlass的答案的帮助,它的工作原理与上面所说的完全一样。不过,我的问题打错了,改变了他的回答方式。下一个数组中的第一项应该是AFTER . blocking。只要把他的currentList.Add(item);
放在if(currentList.Count
-从句前,答案仍然是正确的。也请注意,这个扩展应该只在需要的时候做,因为我们错过了我的Q点,每次它需要循环每个值,因为"阻塞"。
您可以编写一个简单的扩展方法,将单个列表拆分为列表的枚举,每个列表至少包含一个项目,并拆分状态为NotOk
:
public static class MyExtensions
{
public static IEnumerable<List<SomeClass>> Split(this IEnumerable<SomeClass> source)
{
List<SomeClass> currentList = new List<SomeClass>();
foreach (var item in source)
{
if(currentList.Count > 0 && item.State == States.NotOk)
{
yield return currentList;
currentList = new List<SomeClass>();
}
currentList.Add(item);
}
if (currentList.Count > 0)
yield return currentList;
}
}
首先,我将根据Enum类型"OK","NOT OK"对列表进行分组。
,然后基于该类型
执行select下面的函数已经贴出来了,我已经用过了。
list.GroupBy(item => item.SomeProperty).Select(group => new List<T>(group))
查看这篇文章,寻找其他解决方案
var lstItems = new List<SomeType> { /*Your items in here*/ }
var indexCollection = from item in lstItems
where item.EnumIsOkVar == EnumIsOk.NotOk
select lstItems.IndexOf(item);
var lstLst = new List<List<SomeType>>();
foreach (var singleIndex in indexCollection) {
var lstFound = (from item in lst
where lstItems.IndexOf(item) >= singleIndex
where lstItems.IndexOf(item) < singleIndex + 1
select item).ToList();
lstLst.Add(lstFound);
}
我很难理解你的问题,但如果你只是想根据SomeObject
的属性将一个大列表分成两个子列表,那么你可以做以下操作:
List<SomeObject> list1 = mainList.Where(t => t.NotOk);
List<SomeObject> list2 = mainList.Where(t => !t.NotOk);