How to find consecutive same values items as a Linq group

前端 未结 4 1146
無奈伤痛
無奈伤痛 2021-01-29 09:23
var schedules = new List{
    new Item { Id=1, Name = \"S\" },
    new Item { Id=2, Name = \"P\" },
    new Item { Id=3, Name = \"X\" },
    new Item { Id=4,         


        
4条回答
  •  难免孤独
    2021-01-29 10:04

    What you're looking for here is a GroupWhile method.

    Credit to user L.B for the solution. Go give his original answer an UpDoot https://stackoverflow.com/a/20469961/30155

        var schedules = new List{
            new Item { Id=1, Name = "S" },
            new Item { Id=2, Name = "P" },
            new Item { Id=3, Name = "X" },
            new Item { Id=4, Name = "X" },
            new Item { Id=5, Name = "P" },
            new Item { Id=6, Name = "P" },
            new Item { Id=7, Name = "P" },
            new Item { Id=8, Name = "S" }
        };
    
        var results = schedules
            .GroupWhile((preceding, next) => preceding.Name == next.Name) 
            //Group items, while the next is equal to the preceding one
            .Where(s => s.Count() > 1)
            //Only include results where the generated sublist have more than 1 element.
            .ToList();
    
        foreach (var sublist in results)
        {
            foreach (Item i in sublist)
            {
                Console.WriteLine($"{i.Name} - {i.Id}");
            }
            Console.WriteLine("");
        }
    
        Console.ReadLine();
    

    You can add the implementation as an Extension Method to all IEnumerable like so.

    public static class Extensions
    {
        public static IEnumerable> GroupWhile(this IEnumerable seq, Func condition)
        {
            T prev = seq.First();
            List list = new List() { prev };
    
            foreach (T item in seq.Skip(1))
            {
                if (condition(prev, item) == false)
                {
                    yield return list;
                    list = new List();
                }
                list.Add(item);
                prev = item;
            }
    
            yield return list;
        }
    }
    

提交回复
热议问题