我有一个枚举,表明产卵的资格。
protected enum SpawnEligibility
{
Worst,
Ok,
Optimal
}
然后,我有一个返回资格的功能。
protected virtual SpawnEligibility GetEligibility(Vector3 spawn)
{
var players = _instance.FindPlayersInRadius(spawn, 10).ToList();
if (!players.Any())
return SpawnEligibility.Optimal;
return players.Any(x => _instance.CanSeeLocation(x, spawn))
? SpawnEligibility.Worst
: SpawnEligibility.Ok;
}
当选择一个产卵时,我想从具有最高资格水平的产卵中挑选一个随机产卵,尽管它们可能都是Worst
,Ok
,Optimal
,或混合。这是我用来选择产卵的代码。
public virtual Vector3 FindSpawn(BasePlayer player) =>
_spawns.OrderByDescending(GetEligibility).First();
如何使用Spawn键和SpawnEligibility值创建一个字典,或者从列表中返回一个随机元素而不再调用GetEligibility函数?
答案 0 :(得分:5)
听起来我觉得你想通过资格分组,然后通过他们的密钥(降序)对这些组进行排序,然后选择第一组:
var bestSpawnGroup = _spawns
.GroupBy(GetEligibility)
.OrderByDescending(g => g.Key)
.First();
如果GetEligibility
的方法组转换导致问题(我永远不会记住它所处的环境),你可以从lambda表达式中调用它:
var bestSpawnGroup = _spawns
.GroupBy(s => GetEligibility(s))
.OrderByDescending(g => g.Key)
.First();
然后,您可以告知该组的资格(Key
)并在该组中查找随机元素。 (您可以将组转换为列表/数组,也可以使用代码like this从组中选择一个随机元素,而不实现它。)