Вот варианты, которые я могу представить в порядке убывания моего личного предпочтения.
Используйте статическую проверку, а не проверку во время выполнения.Таким образом, для проверки не потребуется вообще перечислять список.Этот вариант имеет ограничение, что он чрезвычайно дорогой.У меня нет доступа к статическому контролеру, так как я бы с удовольствием.Таким образом, в качестве альтернативы, вы могли бы ...
Изменить определение метода, чтобы оно работало ОК в присутствии будущих дат, так что проверка не требуется.
Примерно так:
void ProcessSchedules(IEnumerable<Schedule> schedules)
{
Contract.Requires<ArgumentNullException>(schedules != null);
foreach(var schedule in schedules )
{
if (schedule.Date <= DateTime.Today)
{
// Do something with schedule
}
}
}
Если это не имеет смысла для вашей программы, тогда вы могли бы ...
- Изменить определение метода для принятиясписок в первую очередь.
Вот так:
void ProcessSchedules(List<Schedule> schedules)
{
Contract.Requires<ArgumentException>(Contract.ForAll(schedules,x => x.Date <= DateTime.Today))
foreach(var schedule in schedules )
{
// Do something with schedule
}
}
Вы уже сказали, что принудительное включение его в список будет вариантом, поэтому ясно, что это конечная последовательностьприемлемого размера.Существует высокая вероятность того, что вызывающая сторона использует List<Schedule>
в первую очередь или что есть другие места, где эта реализация будет полезна.
Если вы действительно хотите сохранить IEnumerable
в своемподпись вы могли бы ...
- Просто проигнорируйте предупреждение.
С вашим исходным кодом:
void ProcessSchedules(IEnumerable<Schedule> schedules)
{
Contract.Requires<ArgumentException>(Contract.ForAll(schedules,x => x.Date <= DateTime.Today))
foreach( var schedule in schedules )
{
// Do something with schedule
}
}
Я серьезно не вижупроблема в перечислении списка дважды, и я даже не уверен, почему Resharper выдаст предупреждение за это.
Если создание перечисления расписаний - дорогостоящая операция, это не имеет значения, потому что обычно вы не должныВ любом случае, включите проверку контракта в свой код выпуска.
Если перечисление расписаний считывает данные из базы данных или что-то в этом роде, то контракт в любом случае недействителен, поскольку данные могут изменяться между проверкой иобработка.В этом случае было бы правильнее, если бы метод принимал список или другую кэшированную копию данных, которые не будут видоизменяться.