我有一个枚举来指示生成的资格。
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;
}
在选择生成点时,我想从具有最高资格的生成点中随机选择一个生成点,尽管它们可能都是最差
、还好
、最佳
,或混合。这是我用来选择生成点的代码。
public virtual Vector3 FindSpawn(BasePlayer player) =>
_spawns.OrderByDescending(GetEligibility).First();
如何使用 Spawn 键和 SpawnEligibility 值制作字典,或者从列表中返回随机元素,而无需再次调用 GetEligibility 函数?
最佳答案
在我看来,您想按资格分组,然后按它们的键(降序)对这些组进行排序,然后采用第一组:
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 从组中选择一个随机元素而不具体化它。)
关于c# - 根据枚举从列表中获取元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48484734/