Добавьте файлы проекта.
This commit is contained in:
106
QWERTYkez.WordProcessor/IeExtension.cs
Normal file
106
QWERTYkez.WordProcessor/IeExtension.cs
Normal file
@@ -0,0 +1,106 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user