Это перевод шестой части серии статей Джона Скита "Реализация LINQ to Objects". С оригинальной версией поста можно ознакомиться здесь.
Далее следует тривиальный метод, разговоров о котором будет еще меньше, чем об Empty. Этот пост только ради завершенности.
Что это?Repeat – статический обобщенный метод с единственной перегрузкой, который не является методом расширения:
public static IEnumerable<TResult> Repeat<TResult>(
TResult element,
int count);
Он просто возвращает последовательность, содержащую определенный элемент, который повторяется «count» раз. Единственной проверкой аргумента является то, что count должен быть неотрицательным.
Что мы собираемся тестировать?Здесь на самом деле не так много чего тестировать. Я подумал о четырёх различных сценариях:
- Простая последовательность (повторение строки 3 раза)
- Пустая последовательность (повторение элемента 0 раз)
- Последовательность значений null (чтобы доказать, что «element» может быть null)
- Отрицательное count, чтобы доказать, что валидация аргументов происходит, причем незамедлительно.
Боюсь, это нисколько не интересно.
Давайте имплементируем это!Единственное, что мы могли бы сделать здесь неправильно, это разместить валидацию аргументов непосредственно в блоке итератора… и мы реализовывали паттерн «разделение метода» ранее столько раз, что мы не попадёмся в эту ловушку. Итак, вот код во всем своём скучном отсутствии великолепия:
public static IEnumerable<TResult> Repeat<TResult>(TResult element, int count)
{
if (count < 0)
{
throw new ArgumentOutOfRangeException("count");
}
return RepeatImpl(element, count);
}
private static IEnumerable<TResult> RepeatImpl<TResult>(TResult element, int count)
{
for (int i = 0; i < count; i++)
{
yield return element;
}
}
Вот и все. Хм, интересные моменты, которые стоит отметить ... их нет.
ЗаключениеНет смысла затягивать. Это всё. Следующие на очереди: Count и LongCount - которые действительно имеют несколько интересных моментов.
Комментариев нет:
Отправить комментарий