linq group by contiguous blocks

Gie*_*ius 13 c# linq

假设我有以下数据:

时间状态
10:00 On
11:00 Off
12:00 Off
13:00 Off
14:00 Off
15:00 On
16:00 On

我如何使用Linq将其分组

[开,[10:00]],[关,[11:00,12:00,13:00,14:00]],[开,[15:00,16:00]]

Ani*_*Ani 12

创建一个GroupAdjacent扩展名,例如此处列出的扩展名.

然后就像这样简单:

var groups = myData.GroupAdjacent(data => data.OnOffStatus);
Run Code Online (Sandbox Code Playgroud)


juh*_*arr 5

您也可以使用一个Linq查询使用变量来跟踪更改,如下所示.

int key = 0;
var query = data.Select(
    (n,i) => i == 0 ? 
        new { Value = n, Key = key } : 
        new 
        { 
            Value = n, 
            Key = n.OnOffFlag == data[i - 1].OnOffFlag ? key : ++key 
        })
    .GroupBy(a => a.Key, a => a.Value);
Run Code Online (Sandbox Code Playgroud)

基本上,它为每个项目分配一个键,当当前项目不等于前一项目时,该项目会增加.当然,这假设您的数据位于List或Array中,否则您必须尝试不同的方法