ChunkWhile должен сравнивать текущий элемент с предыдущим и начинать новую группу при false. Для примера получатся [1, 3, 5], [2, 4, 4] и [7].
// case 2
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), память — размер текущей группы, не считая сохранённых вызывающим кодом результатов.