LINQ query — Data aggregation (Group Adjacent)

前端 未结 7 2036
失恋的感觉
失恋的感觉 2020-12-03 03:09

Let\'s take a class called Cls:

public class Cls
{
    public int SequenceNumber { get; set; }
    public int Value { get; set; }
}
7条回答
  •  悲&欢浪女
    2020-12-03 03:46

    Untested dark magic follows. The imperative version seems like it would be easier in this case.

    IEnumerable data = ...;
    var query = data
        .GroupBy(x => x.Value)
        .Select(g => new
        {
            Value = g.Key,
            Sequences = g
                .OrderBy(x => x.SequenceNumber)
                .Select((x,i) => new
                {
                    x.SequenceNumber,
                    OffsetSequenceNumber = x.SequenceNumber - i
                })
                .GroupBy(x => x.OffsetSequenceNumber)
                .Select(g => g
                    .Select(x => x.SequenceNumber)
                    .OrderBy(x => x)
                    .ToList())
                .ToList()
        })
        .SelectMany(x => x.Sequences
            .Select(s => new { First = s.First(), Last = s.Last(), x.Value }))
        .OrderBy(x => x.First)
        .ToList();
    

提交回复
热议问题