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

非随机分配选手至评委的代码问题及修正需求

问题分析与修正方案

原代码存在两个核心问题:

  1. 仅通过contestants.Take(juries.Count)处理了与评委数量相等的选手,剩余选手完全没被分配
  2. 嵌套遍历所有评委时,同一个选手的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 15:27:45