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

如何用C# LINQ或非LINQ实现回合制玩家列表按能量降序交替队伍排序

回合制玩家回合列表排序实现方案

需求说明

需要对玩家回合列表按以下规则排序:

  • 能量最高的玩家排首位
  • 后续按能量降序交替选取不同队伍的玩家

给定测试数据:

玩家能量队伍
Player 1100
Player 2300
Player 351
Player 4601

预期排序结果:

玩家能量队伍
Player 4601
Player 2300
Player 351
Player 1100

LINQ实现方案

核心思路:先按队伍分组并各自降序排序,确定起始队伍后,通过Zip交替合并两组,再拼接剩余元素。

public class PlayerTurn {
    public int energy;
    public int team; // 0或1
    public string name; // 用于标识玩家,测试时需添加
}

// 初始化测试数据
List<PlayerTurn> turnList = new List<PlayerTurn> {
    new PlayerTurn { name = "Player 1", energy = 10, team = 0 },
    new PlayerTurn { name = "Player 2", energy = 30, team = 0 },
    new PlayerTurn { name = "Player 3", energy = 5, team = 1 },
    new PlayerTurn { name = "Player 4", energy = 60, team = 1 }
};

// 1. 按队伍分组,每组内按能量降序排序
var groupedTeams = turnList
    .GroupBy(pt => pt.team)
    .ToDictionary(g => g.Key, g => g.OrderByDescending(pt => pt.energy).ToList());

// 2. 确定能量最高玩家所在的起始队伍
int startTeam = turnList.OrderByDescending(pt => pt.energy).First().team;
int otherTeam = startTeam == 0 ? 1 : 0;

// 3. 交替合并两组,处理长度不等的情况
var sortedTurns = groupedTeams[startTeam]
    .Zip(groupedTeams[otherTeam], (a, b) => new[] { a, b })
    .SelectMany(arr => arr)
    .Concat(groupedTeams[startTeam].Skip(groupedTeams[otherTeam].Count))
    .Concat(groupedTeams[otherTeam].Skip(groupedTeams[startTeam].Count))
    .ToList();

非LINQ实现方案

核心思路:手动拆分两队并排序,找到起始队后循环交替添加元素。

public class PlayerTurn {
    public int energy;
    public int team; // 0或1
    public string name; // 用于标识玩家,测试时需添加
}

// 初始化测试数据
List<PlayerTurn> turnList = new List<PlayerTurn> {
    new PlayerTurn { name = "Player 1", energy = 10, team = 0 },
    new PlayerTurn { name = "Player 2", energy = 30, team = 0 },
    new PlayerTurn { name = "Player 3", energy = 5, team = 1 },
    new PlayerTurn { name = "Player 4", energy = 60, team = 1 }
};

// 1. 拆分两队并各自按能量降序排序
List<PlayerTurn> team0 = new List<PlayerTurn>();
List<PlayerTurn> team1 = new List<PlayerTurn>();
foreach (var pt in turnList) {
    if (pt.team == 0) team0.Add(pt);
    else team1.Add(pt);
}
// 手动排序(也可直接用List.Sort)
team0.Sort((a, b) => b.energy.CompareTo(a.energy));
team1.Sort((a, b) => b.energy.CompareTo(a.energy));

// 2. 找到能量最高的玩家,确定起始队伍
PlayerTurn topPlayer = turnList[0];
foreach (var pt in turnList) {
    if (pt.energy > topPlayer.energy) topPlayer = pt;
}
List<PlayerTurn> firstTeam = topPlayer.team == 0 ? team0 : team1;
List<PlayerTurn> secondTeam = topPlayer.team == 0 ? team1 : team0;

// 3. 交替合并列表
List<PlayerTurn> sortedList = new List<PlayerTurn>();
int index = 0;
while (index < firstTeam.Count || index < secondTeam.Count) {
    if (index < firstTeam.Count) sortedList.Add(firstTeam[index]);
    if (index < secondTeam.Count) sortedList.Add(secondTeam[index]);
    index++;
}

内容的提问来源于stack exchange,提问作者Dênis Fernandes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 04:14:54