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);
|
|||
|
|
}
|
|||
|
|
}
|