在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号),可以这么实现:
- 先把选手列表按
Seed升序排序,确保种子顺序正确 - 用双指针一头一尾配对,生成对决分组
对应的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
相关产品推荐
相关产品推荐

