How to group consecutive similar items of a collection?

后端 未结 5 855
忘了有多久
忘了有多久 2020-12-06 23:06

Consider the following collection.

  • True
  • False
  • False
  • False
  • True
  • True
  • False
  • False

I

5条回答
  •  时光取名叫无心
    2020-12-06 23:17

    This does what you're looking for and is generic:

    private static IEnumerable> GroupConsecutive(this IEnumerable set, Func predicate)
    {
        var i = 0;
        var k = 0;
        var ranges = from e in set
                     let idx = ++i
                     let next = set.ElementAtOrDefault(idx)
                     let key = (predicate(e, next)) ? k : k++
                     group e by key into g
                     select g;
        return ranges;
    }
    

    Usage:

    var set = new List
                {
                    true,
                    false,
                    false,
                    false,
                    true,
                    true,
                    false,
                    false,
                };
    var groups = set.GroupConsecutive((b1, b2) => (b1 == b2));
    foreach (var g in groups)
    {
        Console.WriteLine(g.Key);
        foreach (var b in g)
            Console.WriteLine("\t{0}", b);
    }
    

    Output:

    0
            True
    1
            False
            False
            False
    2
            True
            True
    3
            False
            False
    

提交回复
热议问题