Linq/C#:如何根据列表项信息将列表拆分为可变长度块?

Mar*_*cke 3 .net c# linq list

我试图Record根据某些Type信息将 Linq 中的类型列表拆分为子列表。每组记录前面总是有一个类型为“a”的记录,后面总是有一个类型为“b”的记录。我有一堂课Record

class Record
{
    public string Type { get; set; }
    public string SomeOtherInformation { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是一个示例列表 ( List<Record> records):

Type    SomeOtherInformation
a       ......
x       ......
x       ......
b       ......
a       ......
b       ......
a       ......
x       ......
x       ......
x       ......
x       ......
x       ......
b       ......
Run Code Online (Sandbox Code Playgroud)

期望的输出是 ( List<List<Record>> lists):

List #1:        List #2:        List #3:
a       ......  a       ......  a       ......
x       ......  b       ......  x       ......
x       ......                  x       ......
b       ......                  x       ......
                                x       ......
                                x       ......
                                b       ......
Run Code Online (Sandbox Code Playgroud)

我目前正在使用 for 循环遍历此列表,并在类型为“a”时创建一个新列表,并在项目类型为“b”时将其添加到子列表列表中。我想知道 Linq 是否有更好的方法来实现这一点。这可以用 Linq 来完成吗?如果可以,怎么做?

Jon*_*eet 5

据我所知,您无法使用普通的 LINQ干净地完成此操作。LINQ 中的流式操作符依赖于您能够仅基于该项目以及其在原始源中的索引来做出关于该项目的决定(例如,是否过滤它、如何投影它、如何对其进行分组)。就您而言,您确实需要更多信息 - 您需要知道b您已经看到了多少项目。

可以这样做:

int bs = 0;
var groups = records.GroupBy(item => item.Type == 'b' ? bs++ : bs,
                             (key, group) => group.ToList())
                    .ToList();
Run Code Online (Sandbox Code Playgroud)

然而,这依赖于分组投影内的副作用b++(以跟踪b我们已经看到的项目数量)——这绝对不是惯用的 LINQ,我不会推荐它。