获取包含特定字符串的枚举的所有值

Get all values of enum which contain a specific string

提问人:AcinonX 提问时间:10/18/2023 更新时间:10/18/2023 访问量:67

问:

我有这个代码,可以找到用户从Unity枚举中的值中按下的键:KeyCode

foreach(KeyCode kcode in System.Enum.GetValues(typeof(KeyCode)))
{
  if (Input.GetKey(kcode))
  Debug.Log("KeyCode down: " + kcode);
}

我只希望它读取数字键,其格式为键上的数字在哪里。为此,我相信我只需要获得开头包含的值。AlphaNNAlpha

如何将搜索限制为仅包含名称开头的值?KeyCodeAlpha

C# Unity-Game-Engine 输入 枚举

评论


答:

2赞 hijinxbassist 10/18/2023 #1

创建要检查的键代码数组。

private KeyCode[] numberKeys = new KeyCode[]
{
    KeyCode.Alpha0,
    KeyCode.Alpha1,
    KeyCode.Alpha2,
    KeyCode.Alpha3,
    KeyCode.Alpha4,
    KeyCode.Alpha5,
    KeyCode.Alpha6,
    KeyCode.Alpha7,
    KeyCode.Alpha8,
    KeyCode.Alpha9,
};

然后在你做循环的地方,使用这个数组。

foreach (var keycode in numberKeys)
{
    if (Input.GetKeyDown(keycode))
    {
        Debug.Log($"KeyCode down: {keycode}");
    }
}
0赞 lidqy 10/18/2023 #2

值 from 形成 Sequence: https://docs.unity3d.com/ScriptReference/KeyCode.html 所以你只需要检查它们是否在 Alpha0 到 Alpha9 的范围内。Alpha0Alpha9

foreach(KeyCode kcode in Enum.GetValues(typeof(KeyCode)).Cast<KeyCode>()
        .Where(kc => kc >= KeyCode.Alpha0 && kc <= KeyCode.Alpha9))
{
    if (Input.GetKey(kcode)) ...
}

检查以“Alpha”开头的名称将提供相同的值......

foreach(KeyCode kcode in Enum.GetValues(typeof(KeyCode)).Cast<KeyCode>()
        .Where(kc => $"{kc:G}".StartsWith("Alpha"))
{
    if (Input.GetKey(kcode)) ...
}

...或使用 Linq

var kcode = Enum.GetValues(typeof(KeyCode)).Cast<KeyCode>().FirstOrDefault(kc => 
    $"{kc:G}".StartsWith("Alpha") && Input.GetKey(kc));

 Debug.Log("KeyCode down: " + (kcode?.ToString() ?? "-no digit key pressed-"));

从 .NET 5 及更高版本开始,您可以替换:
Enum.GetValues(typeof(KeyCode)).Cast<KeyCode>()Enum.GetValues<KeyCode>()

评论

0赞 AcinonX 10/18/2023
当我使用最上面的示例时,我收到以下错误:.你能解释一下吗?The non-generic method 'Enum.GetValues(Type)' cannot be used with type arguments
0赞 lidqy 10/18/2023
你写了吗:或者后者是正确的,第一个会提供你引用的错误......Enum.GetValues<KeyCode>(typeof(KeyCode))Enum.GetValues<KeyCode>()
0赞 lidqy 10/18/2023
它要么 or .但第一个更好,因为它以 KeyCode[] 而不是 object[] 的形式返回值。Enum.GetValues<KeyCode>()Enum.GetValues(typeof(KeyCode))
0赞 AcinonX 10/18/2023
“更好”的版本会导致错误。替代方案会导致不同的错误
0赞 lidqy 10/18/2023
它只是一个标准的 .NET 库方法。但它需要 .NET (Core) 5 及更高版本。在 .NET Framework 中,它不可用。另一个错误是您需要强制转换:.我调整了我的代码Enum.GetValues(typeof(KeyCode)).Cast<KeyCode>()