Split a list into multiple lists at increasing sequence broken

前端 未结 9 1110
不知归路
不知归路 2021-02-18 19:11

I\'ve a List of int and I want to create multiple List after splitting the original list when a lower or same number is found. Numbers are not in sorted order.<

9条回答
  •  有刺的猬
    2021-02-18 19:50

    I'd just go for something simple:

    public static IEnumerable> SplitWhenNotIncreasing(List numbers)
    {
        for (int i = 1, start = 0; i <= numbers.Count; ++i)
        {
            if (i != numbers.Count && numbers[i] > numbers[i - 1])
                continue;
    
            yield return numbers.GetRange(start, i - start);
            start = i;
        }
    }
    

    Which you'd use like so:

    List data = new List { 1, 2, 1, 2, 3, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 6 };
    
    foreach (var subset in SplitWhenNotIncreasing(data))
        Console.WriteLine(string.Join(", ", subset));
    

    If you really did need to work with IEnumerable, then the simplest way I can think of is like this:

    public sealed class IncreasingSubsetFinder where T: IComparable
    {
        public static IEnumerable> Find(IEnumerable numbers)
        {
            return new IncreasingSubsetFinder().find(numbers.GetEnumerator());
        }
    
        IEnumerable> find(IEnumerator iter)
        {
            if (!iter.MoveNext())
                yield break;
    
            while (!done)
                yield return increasingSubset(iter);
        }
    
        IEnumerable increasingSubset(IEnumerator iter)
        {
            while (!done)
            {
                T prev = iter.Current; 
                yield return prev;
    
                if ((done = !iter.MoveNext()) || iter.Current.CompareTo(prev) <= 0)
                    yield break;
            }
        }
    
        bool done;
    }
    

    Which you would call like this:

    List data = new List { 1, 2, 1, 2, 3, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 6 };
    
    foreach (var subset in IncreasingSubsetFinder.Find(data))
        Console.WriteLine(string.Join(", ", subset));
    

提交回复
热议问题