如何使用OrderBy列表追踪竞速游戏车辆位置 支持基于圈数的排名
问题根源
- 原有排序规则优先级错误,未将圈数这个最高优先级的排序维度纳入逻辑,跨圈场景下自然无法正确区分玩家进度
- Linq 中连续调用
OrderBy会重置排序逻辑,前序的排序规则会被后续的OrderBy完全覆盖,原有代码里的距离排序其实没有生效,需要用ThenBy/ThenByDescending追加次级排序条件
修复方案
假设你已实现的已完成圈数字段为 completedLaps,可直接按如下逻辑修改排序代码:
IOrderedEnumerable<KeyValuePair<string, Player>> sortedPlayer = players // 第一优先级:已完成圈数降序,圈数越多排名越靠前 .OrderByDescending(x => x.Value.completedLaps) // 第二优先级:当前激活路点索引降序,同圈数下路过的路点越多排名越靠前 .ThenByDescending(x => x.Value.activeWaypointIndex) // 第三优先级:到当前路点的距离升序,同圈数同路点下离路点越近排名越靠前 .ThenBy(x => x.Value.distanceToWaypoint);
逻辑验证
比如总路点为10的场景下:
- 跑了2圈、当前在1号路点的玩家,圈数大于跑了1圈在10号路点的玩家,会排在前面
- 同圈数下,在10号路点的玩家比在1号路点的玩家排名更高,符合竞速进度规则
- 同圈数同路点的玩家,离当前路点更近的排名更高,准确体现短距离的先后差距
内容的提问来源于stack exchange,提问作者Savad
相关产品推荐
相关产品推荐

