分裂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点,每次它需要循环每个值,因为"阻塞"。

分裂List< SomeObject>到几个子列表

您可以编写一个简单的扩展方法,将单个列表拆分为列表的枚举,每个列表至少包含一个项目,并拆分状态为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);