从枚举中获取列表中的元素

时间:2018-01-28 09:02:57

标签: c#

我有一个枚举,表明产卵的资格。

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;
}

当选择一个产卵时,我想从具有最高资格水平的产卵中挑选一个随机产卵,尽管它们可能都是WorstOkOptimal ,或混合。这是我用来选择产卵的代码。

public virtual Vector3 FindSpawn(BasePlayer player) => 
    _spawns.OrderByDescending(GetEligibility).First();

如何使用Spawn键和SpawnEligibility值创建一个字典,或者从列表中返回一个随机元素而不再调用GetEligibility函数?

1 个答案:

答案 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从组中选择一个随机元素,而不实现它。)