You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历用户列表并均匀分配至指定时间槽

通知调度:用户均匀分配到时间槽的实现方案

需求说明

实现通知调度功能,从数据库获取用户列表后,将用户均匀分配到指定时间槽。遍历用户时依次将其加入时间槽,当遍历到时间槽末尾后循环从头分配,确保触达效果最优。

最初的时间槽模型

采用类属性定义各时段的时间槽,每个属性存储对应时段接收通知的用户邮箱列表:

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
});

优化后的解决方案

通过调整时间槽存储方式和循环逻辑,实现了均匀分配,同时提升了功能扩展性:

  1. 改用数组存储时间槽
    弃用类属性的固定定义方式,改用数组管理时间槽,新增或删除时段操作更灵活:
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))
  };
}
  1. 实现均匀分配的循环逻辑
    利用取余运算实现循环分配:通过用户索引对时间槽长度取余,得到目标时间槽的索引,从而将用户依次循环分配到各个时段:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 06:57:09