c# - 根据枚举从列表中获取元素

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

在选择生成点时,我想从具有最高资格的生成点中随机选择一个生成点,尽管它们可能都是最差还好最佳,或混合。这是我用来选择生成点的代码。

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/

相关文章:

c# - 如何在不使用 OracleObjectMappingAttribute 的情况下使用 ODP.NET 从 Oracle UDT 进行映射?

C# 检测在运行时第二次运行应用程序期间更改了哪些 C# (.cs/poco) 文件

c# - 使用 Roslyn 编译语法树

c# - 为什么后续的直接方法调用比第一次调用快很多?

c# - DoubleAnimation - 旋转图像

c# - 上下文菜单背景着色

c# - 使用 DateTime.Now.Ticks 生成唯一的数字 ID

c# - 套接字自动关闭

c# - 我如何知道 .Net Compact Framework 上的线程何时结束?

c# - Asp.net gridview列宽