gpt4 book ai didi

c# - 将 List 拆分为多个子列表

转载 作者:太空宇宙 更新时间:2023-11-03 20:30:00 29 4
gpt4 key购买 nike

我有一个数组 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 的回答对我很有帮助,它完全按照说明工作。虽然,我在我的问题中犯了一个错字,这改变了他回答的行为。下一个数组中的第一项应该在 .Blocking 之后。就拿他的currentList.Add(item);if(currentList.Count 之前- 从句和答案仍然正确。另请注意,只有在需要时才应进行此扩展,因为每次由于“阻塞”而需要循环每个值时,我们都错过了我的问题的要点。

最佳答案

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

关于c# - 将 List<SomeObject> 拆分为多个子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7995233/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com