106 lines
5.2 KiB
C#
106 lines
5.2 KiB
C#
namespace QWERTYkez.WordProcessor;
|
||
|
||
internal static class IeExtension
|
||
{
|
||
/// <summary>
|
||
/// Выполняет указанные действия для первого и последующих элементов последовательности.
|
||
/// </summary>
|
||
/// <typeparam name="T">Тип элементов последовательности.</typeparam>
|
||
/// <param name="items">Последовательность элементов.</param>
|
||
/// <param name="first">Действие над первым элементом (если есть).</param>
|
||
/// <param name="next">Действие над каждым последующим элементом, начиная со второго.</param>
|
||
/// <exception cref="ArgumentNullException">Возникает, если items или любой из делегатов равен null.</exception>
|
||
public static void ForFirstNext<T>(this IEnumerable<T> items, Action<T> first, Action<T> next)
|
||
{
|
||
if (items is null) throw new ArgumentNullException(nameof(items));
|
||
if (first is null) throw new ArgumentNullException(nameof(first));
|
||
if (next is null) throw new ArgumentNullException(nameof(next));
|
||
|
||
using var enumerator = items.GetEnumerator();
|
||
|
||
if (!enumerator.MoveNext())
|
||
return;
|
||
|
||
first(enumerator.Current);
|
||
|
||
while (enumerator.MoveNext())
|
||
{
|
||
next(enumerator.Current);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Выполняет указанные действия для первого, промежуточных и последнего элементов последовательности.
|
||
/// Если последовательность содержит только один элемент, то для него вызываются и first, и last.
|
||
/// </summary>
|
||
/// <typeparam name="T">Тип элементов последовательности.</typeparam>
|
||
/// <param name="items">Последовательность элементов.</param>
|
||
/// <param name="first">Действие над первым элементом.</param>
|
||
/// <param name="next">Действие над элементами, которые не являются ни первыми, ни последними.</param>
|
||
/// <param name="last">Действие над последним элементом.</param>
|
||
/// <exception cref="ArgumentNullException">Возникает, если items или любой из делегатов равен null.</exception>
|
||
public static void ForFirstNextLast<T>(this IEnumerable<T> items, Action<T> first, Action<T> next, Action<T> last)
|
||
{
|
||
if (items is null) throw new ArgumentNullException(nameof(items));
|
||
if (first is null) throw new ArgumentNullException(nameof(first));
|
||
if (next is null) throw new ArgumentNullException(nameof(next));
|
||
if (last is null) throw new ArgumentNullException(nameof(last));
|
||
|
||
using var enumerator = items.GetEnumerator();
|
||
|
||
if (!enumerator.MoveNext())
|
||
return;
|
||
|
||
T firstItem = enumerator.Current;
|
||
|
||
// Если только один элемент
|
||
if (!enumerator.MoveNext())
|
||
{
|
||
first(firstItem);
|
||
last(firstItem);
|
||
return;
|
||
}
|
||
|
||
// Есть как минимум два элемента
|
||
first(firstItem);
|
||
|
||
T prev = enumerator.Current; // второй элемент
|
||
while (enumerator.MoveNext())
|
||
{
|
||
next(prev); // предыдущий элемент точно не последний
|
||
prev = enumerator.Current;
|
||
}
|
||
|
||
last(prev); // последний элемент
|
||
}
|
||
|
||
/// <summary>
|
||
/// Выполняет указанные действия для всех элементов, кроме последнего, и для последнего элемента.
|
||
/// Если последовательность содержит только один элемент, то вызывается только last.
|
||
/// </summary>
|
||
/// <typeparam name="T">Тип элементов последовательности.</typeparam>
|
||
/// <param name="items">Последовательность элементов.</param>
|
||
/// <param name="next">Действие над элементами, не являющимися последними.</param>
|
||
/// <param name="last">Действие над последним элементом.</param>
|
||
/// <exception cref="ArgumentNullException">Возникает, если items или любой из делегатов равен null.</exception>
|
||
public static void ForNextLast<T>(this IEnumerable<T> items, Action<T> next, Action<T> last)
|
||
{
|
||
if (items is null) throw new ArgumentNullException(nameof(items));
|
||
if (next is null) throw new ArgumentNullException(nameof(next));
|
||
if (last is null) throw new ArgumentNullException(nameof(last));
|
||
|
||
using var enumerator = items.GetEnumerator();
|
||
|
||
if (!enumerator.MoveNext())
|
||
return;
|
||
|
||
T prev = enumerator.Current;
|
||
while (enumerator.MoveNext())
|
||
{
|
||
next(prev);
|
||
prev = enumerator.Current;
|
||
}
|
||
|
||
last(prev);
|
||
}
|
||
} |