Files
QWERTYkez.OpenXmlProcessors/QWERTYkez.WordProcessor/IeExtension.cs
2026-06-05 15:58:03 +07:00

106 lines
5.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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);
}
}