非随机分配选手至评委的代码问题及修正需求
问题分析与修正方案
原代码存在两个核心问题:
- 仅通过
contestants.Take(juries.Count)处理了与评委数量相等的选手,剩余选手完全没被分配 - 嵌套遍历所有评委时,同一个选手的
JuryId会被反复覆盖,最终只会保留最后一个评委的ID
要实现按顺序平均分组分配(如8个选手分给2位评委,前4个给评委1,后4个给评委2),可以按以下方式修改代码:
public IActionResult DismissContestants() { var contestants = _contestantService.GetList(a => a.JuryId == null).Data; var juries = _roleService.GetList(x => x.RoleId == 4).Data; // 避免评委数量为0的异常情况 if (!juries.Any()) { return RedirectToAction("GetList", "SiteSetting"); } int totalContestants = contestants.Count; int juryCount = juries.Count; // 计算每个评委基础分配数 int baseCount = totalContestants / juryCount; // 计算需要多分配1个选手的评委数量(处理总人数无法整除的情况) int extraCount = totalContestants % juryCount; int currentIndex = 0; foreach (var jury in juries) { // 当前评委需要分配的选手数量:前extraCount个评委多分配1个 int assignCount = baseCount + (extraCount > 0 ? 1 : 0); extraCount--; // 取出对应区间的选手并分配评委ID var assignedContestants = contestants.Skip(currentIndex).Take(assignCount); foreach (var contestant in assignedContestants) { contestant.JuryId = jury.UserId; _contestantService.Update(contestant); } currentIndex += assignCount; // 如果所有选手都已分配,提前退出循环 if (currentIndex >= totalContestants) { break; } } return RedirectToAction("GetList", "SiteSetting"); }
关键改动说明:
- 新增了评委数量为空的判断,避免出现除以0的异常
- 计算每个评委的分配数量时,处理了总选手数无法被评委数整除的情况(比如9个选手2个评委,评委1分5个,评委2分4个)
- 按评委顺序,依次为对应区间的选手分配ID,不再嵌套遍历评委,避免了ID被覆盖的问题
- 通过
currentIndex跟踪当前分配到的选手位置,确保每个选手只被分配一次
内容的提问来源于stack exchange,提问作者Cassawena
相关产品推荐
相关产品推荐

