如何用C# LINQ或非LINQ实现回合制玩家列表按能量降序交替队伍排序
回合制玩家回合列表排序实现方案
需求说明
需要对玩家回合列表按以下规则排序:
- 能量最高的玩家排首位
- 后续按能量降序交替选取不同队伍的玩家
给定测试数据:
| 玩家 | 能量 | 队伍 |
|---|---|---|
| Player 1 | 10 | 0 |
| Player 2 | 30 | 0 |
| Player 3 | 5 | 1 |
| Player 4 | 60 | 1 |
预期排序结果:
| 玩家 | 能量 | 队伍 |
|---|---|---|
| Player 4 | 60 | 1 |
| Player 2 | 30 | 0 |
| Player 3 | 5 | 1 |
| Player 1 | 10 | 0 |
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
相关产品推荐
相关产品推荐

