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

在MVC中如何从大列表创建子列表并实现赛事选手分组对决?

Hey,我已经被这个问题卡了快一天了,怎么都摸不到靠谱的解决方案——搞不好我一开始的思路就歪了😅。我现在需要把一个包含16名赛事选手的大列表拆分成对决分组,也就是把这个大列表拆成多个子列表,每个子列表对应一组要对决的选手。

先给你看下我现有列表的结构(实际是16名选手,这里只放4个的示例):

IList<TeamModel> tournamentList = new List<TeamModel>();
tournamentList.Add(new TeamModel() { ID = 1, Seed = 1, /* 其他选手属性 */ });
tournamentList.Add(new TeamModel() { ID = 2, Seed = 2, /* 其他选手属性 */ });
tournamentList.Add(new TeamModel() { ID = 3, Seed = 3, /* 其他选手属性 */ });
tournamentList.Add(new TeamModel() { ID = 4, Seed = 4, /* 其他选手属性 */ });

我的核心需求

把这个16人的大列表拆成8个对决子列表,每个子列表里有2名要对决的选手。


可能的解决方案(按常见规则)

如果是按照标准淘汰赛的种子对阵逻辑(高种子对低种子,比如1号种子打16号,2号打15号),可以这么实现:

  1. 先把选手列表按Seed升序排序,确保种子顺序正确
  2. 用双指针一头一尾配对,生成对决分组

对应的C#代码:

// 先按种子排序,保证顺序正确
var sortedTeams = tournamentList.OrderBy(team => team.Seed).ToList();
var matchups = new List<List<TeamModel>>();

int leftPtr = 0;
int rightPtr = sortedTeams.Count - 1;

// 一头一尾配对,直到指针相遇
while (leftPtr < rightPtr)
{
    matchups.Add(new List<TeamModel> { sortedTeams[leftPtr], sortedTeams[rightPtr] });
    leftPtr++;
    rightPtr--;
}

// 此时matchups就是包含8组对决的列表(16名选手时)

如果是需要完全随机分组(不考虑种子排名),可以用洗牌算法打乱列表后,每两个一组:

// 用Guid实现简单洗牌(也可以用Fisher-Yates算法更高效)
var shuffledTeams = tournamentList.OrderBy(_ => Guid.NewGuid()).ToList();
var matchups = new List<List<TeamModel>>();

// 每两个选手组成一组
for (int i = 0; i < shuffledTeams.Count; i += 2)
{
    if (i + 1 < shuffledTeams.Count)
    {
        matchups.Add(new List<TeamModel> { shuffledTeams[i], shuffledTeams[i + 1] });
    }
}

补充说明

如果你的分组规则不是这两种(比如有同区回避、种子轮空、特定对阵要求),可以补充具体的规则细节,我再调整方案~

内容的提问来源于stack exchange,提问作者mikew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:44:01