代码之家  ›  专栏  ›  技术社区  ›  Ilan Keshet

C#Linq查询选择以字符串开头的所有枚举

  •  2
  • Ilan Keshet  · 技术社区  · 6 年前

    enum 以传入字符串开头的(不区分大小写)

    例子:

    enum Test
    {
       Cat,
       Caterpillar,
       @Catch,
       Bat
    }
    

    "cat" 对于这个Linq查询,它将选择 Test.Cat Test.Caterpillar , Test.Catch

    1 回复  |  直到 6 年前
        1
  •  3
  •   spender    6 年前
    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))
    

    或者,如果你真的在做这个,你可以提前准备一个前缀查找

    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)
    

    IEnumerable<Test> values = lookup["cat"];
    

    以牺牲一点内存为代价。可能不值得!