如何遍历用户列表并均匀分配至指定时间槽
通知调度:用户均匀分配到时间槽的实现方案
需求说明
实现通知调度功能,从数据库获取用户列表后,将用户均匀分配到指定时间槽。遍历用户时依次将其加入时间槽,当遍历到时间槽末尾后循环从头分配,确保触达效果最优。
最初的时间槽模型
采用类属性定义各时段的时间槽,每个属性存储对应时段接收通知的用户邮箱列表:
public class Slots { public List<string> NineAM { get; set; } = default!; public List<string> TenAM { get; set; } = default!; public List<string> OnePM { get; set; } = default!; public List<string> TwoPM { get; set; } = default!; }
待解决的问题
无法编写有效的循环逻辑实现用户的均匀分配,仅能梳理出手动分配的伪代码:
var users = _context.Users.ToListAsync(); users.ForEach(user => { // Add first user to 9AM // Add seconds user to 10AM // Add third user to 1PM // Add fourth user to 2PM // Add fifth user to 9AM });
优化后的解决方案
通过调整时间槽存储方式和循环逻辑,实现了均匀分配,同时提升了功能扩展性:
- 改用数组存储时间槽
弃用类属性的固定定义方式,改用数组管理时间槽,新增或删除时段操作更灵活:
private DateTime[] GetTimeSlots() { return new DateTime[] { DateTime.Now.Date.Add(new TimeSpan(9, 0, 0)), DateTime.Now.Date.Add(new TimeSpan(10, 0, 0)), DateTime.Now.Date.Add(new TimeSpan(13, 0, 0)), DateTime.Now.Date.Add(new TimeSpan(14, 0, 0)) }; }
- 实现均匀分配的循环逻辑
利用取余运算实现循环分配:通过用户索引对时间槽长度取余,得到目标时间槽的索引,从而将用户依次循环分配到各个时段:
var slots = GetTimeSlots(); foreach (var user in users) { var userIndex = users.IndexOf(user); var targetSlotIndex = userIndex % slots.Length; var targetTime = slots[targetSlotIndex]; // 后续可根据targetTime将用户邮箱添加到对应时段的列表中 }
内容的提问来源于stack exchange,提问作者lebber
相关产品推荐
相关产品推荐

