提问人:AcinonX 提问时间:10/18/2023 更新时间:10/18/2023 访问量:67
获取包含特定字符串的枚举的所有值
Get all values of enum which contain a specific string
问:
我有这个代码,可以找到用户从Unity枚举中的值中按下的键:KeyCode
foreach(KeyCode kcode in System.Enum.GetValues(typeof(KeyCode)))
{
if (Input.GetKey(kcode))
Debug.Log("KeyCode down: " + kcode);
}
我只希望它读取数字键,其格式为键上的数字在哪里。为此,我相信我只需要获得开头包含的值。AlphaN
N
Alpha
如何将搜索限制为仅包含名称开头的值?KeyCode
Alpha
答:
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 的范围内。Alpha0
Alpha9
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>()
评论