我有一个数组List<SomeObject>
,其中包含日期的升序(还有一些包含信息的字段)。该列表将分组为List<List<SomeObject>>
,这与我的主题相关。
一个List<SomeObject>
组成List<List<SomeObject>>
。在前一种情况下,只包含1行。
某些计算发生在该行的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..
数组中的每一行都有一个类型(枚举),通常为“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..
然后我可以在每个列表上单独进行组合/计算总和,最后将每个组合在一起。
[编辑]
我得到了BrokenGlass答案的帮助,完全按照说明工作。虽然,我在我的问题中做了一个错字,改变了他的答案的行为。下一个数组中的第一项应该是AFTER .Blocking。只需在currentList.Add(item);
- 条款之前取if(currentList.Count
,答案仍然正确。还请注意,只有在需要时才应该进行此扩展,因为每次因为“阻塞”而需要循环每个值时,我们都会错过我的Q.
答案 0 :(得分:2)
首先,我会根据枚举类型“确定”,“不行”来对列表进行分组。
然后根据该类型进行选择
以下功能已经发布我已经使用过它。
list.GroupBy(item => item.SomeProperty).Select(group => new List<T>(group))
查看此post以获取其他解决方案
答案 1 :(得分:2)
您可以编写一个简单的扩展方法,将单个列表拆分为列表枚举,每个列表至少包含一个项目,并在状态为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;
}
}
答案 2 :(得分:1)
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);
}
答案 3 :(得分:0)
我很难关注您的问题,但如果您只想根据SomeObject
的属性将大型列表拆分为两个子列表,那么您可以执行以下操作:
List<SomeObject> list1 = mainList.Where(t => t.NotOk);
List<SomeObject> list2 = mainList.Where(t => !t.NotOk);