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!