Enum.GetValues(typeof(Test)) //IEnumerable but not IEnumerable<Test>
.Cast<Test>() //so we must Cast<Test>() for LINQ
.Where(test => Enum.GetName(typeof(Test), test)
.StartsWith("cat", StringComparison.OrdinalIgnoreCase))
or if you're really hammering this, you might prepare a prefix lookup ahead of time
ILookup<string, Test> lookup = Enum.GetValues(typeof(Test))
.Cast<Test>()
.Select(test => (name: Enum.GetName(typeof(Test), test), value: test))
.SelectMany(x => Enumerable.Range(1, x.name.Length)
.Select(n => (prefix: x.name.Substring(0, n), x.value) ))
.ToLookup(x => x.prefix, x => x.value, StringComparer.OrdinalIgnoreCase)
so now you can
IEnumerable<Test> values = lookup["cat"];
in zippy O(1) time at the expense of a bit of memory. Probably not worth it!