将列表<someobject>拆分为多个子列表</someobject>

时间:2011-11-03 12:56:04

标签: c# linq

我有一个数组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.

4 个答案:

答案 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);