这里是我可以在降我个人的偏好顺序想到的选项。
像这样:
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的会发出这样的警告。
如果生成的时间表枚举是昂贵的操作,也不要紧,因为你通常不应包括合同确认您发布的代码反正。
如果时间表枚举从数据库,或者类似的东西阅读,那么合同是无效的,无论如何,因为数据可能会验证和处理之间切换。在这种情况下,该方法接受不会变异的列表或某些其他缓存的数据副本会更加正确。
我刚刚阅读了关于'ReadOnlyCollection'。在这种情况下,这可以被视为替代方案吗? – Jonn
@John - 是的,我认为'ReadOnlyCollection'将是一个不错的选择。 –