// case 2

ChunkWhile должен сравнивать текущий элемент с предыдущим и начинать новую группу при false. Для примера получатся [1, 3, 5], [2, 4, 4] и [7].

Короткий ответ

Что ответить на собеседовании

ChunkWhile должен сравнивать текущий элемент с предыдущим и начинать новую группу при false. Для примера получатся [1, 3, 5], [2, 4, 4] и [7].

Подробный разбор

Ответ с пояснениями

Условие

// case 2 // реализовать экстеншен chunkwhile: // - объединяет соседние элементы в группы, пока samegroup(prev, current) == true.

var data = new[] { 1, 3, 5, 2, 4, 4, 7 }; var chunks = data.chunkwhile((prev, curr) => (prev % 2) == (curr % 2)); foreach (var chunk in chunks) { console.writeline($"[{string.join(", ", chunk)}]"); }

public static class case2class { public static ienumerable<ireadonlylist> chunkwhile( this ienumerable source, func<t, t, bool> samegroup) { throw new notimplementedexception(); } }

Ответ

ChunkWhile должен сравнивать текущий элемент с предыдущим и начинать новую группу при false. Для примера получатся [1, 3, 5], [2, 4, 4] и [7].

Регистр имён в исходном фрагменте C# повреждён. Исправленный extension method:

using System;
using System.Collections.Generic;

public static class SequenceExtensions
{
    public static IEnumerable<IReadOnlyList<T>> ChunkWhile<T>(
        this IEnumerable<T> source, Func<T, T, bool> sameGroup)
    {
        if (source == null) throw new ArgumentNullException(nameof(source));
        if (sameGroup == null) throw new ArgumentNullException(nameof(sameGroup));
        return Iterate();

        IEnumerable<IReadOnlyList<T>> Iterate()
        {
            using (var e = source.GetEnumerator())
            {
                if (!e.MoveNext()) yield break;
                var previous = e.Current;
                var group = new List<T> { previous };
                while (e.MoveNext())
                {
                    var current = e.Current;
                    if (!sameGroup(previous, current))
                    {
                        yield return group.AsReadOnly();
                        group = new List<T>();
                    }
                    group.Add(current);
                    previous = current;
                }
                yield return group.AsReadOnly();
            }
        }
    }
}

Вызов: data.ChunkWhile((prev, curr) => prev % 2 == curr % 2). Сравниваются соседи, не первый элемент группы; транзитивность предиката не требуется. Обход ленивый по группам, время O(n), память — размер текущей группы, не считая сохранённых вызывающим кодом результатов.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее