枚举类型的高效子串匹配实现方案问询
枚举子串匹配实现方案
针对你的需求,这里提供两种实现方式,支持大小写不敏感的子串匹配,同时兼顾效率:
基础实现
直接遍历枚举所有值,检查名称是否包含目标子串:
public static IEnumerable<TEnum> GetEnumValuesWithSubstring<TEnum>(string substring) where TEnum : Enum { if (string.IsNullOrWhiteSpace(substring)) throw new ArgumentException("匹配子串不能为空或空白", nameof(substring)); foreach (TEnum enumVal in Enum.GetValues(typeof(TEnum))) { if (enumVal.ToString().IndexOf(substring, StringComparison.OrdinalIgnoreCase) != -1) { yield return enumVal; } } }
使用示例
string substringToMatch = "Green"; var matches = GetEnumValuesWithSubstring<Colors>(substringToMatch); // 遍历输出匹配结果 foreach (var color in matches) { Console.WriteLine(color); // 输出:Green、LightGreen }
高性能缓存版
如果需要频繁调用该方法,或者枚举类型较多/值较多,可以通过缓存枚举的名称与值映射,避免重复反射操作:
private static readonly Dictionary<Type, (Enum Value, string Name)[]> _enumNameCache = new(); public static IEnumerable<TEnum> GetEnumValuesWithSubstring<TEnum>(string substring) where TEnum : Enum { if (string.IsNullOrWhiteSpace(substring)) throw new ArgumentException("匹配子串不能为空或空白", nameof(substring)); Type enumType = typeof(TEnum); if (!_enumNameCache.TryGetValue(enumType, out var enumData)) { // 首次调用时缓存枚举数据 enumData = Enum.GetValues(enumType) .Cast<Enum>() .Select(e => (e, e.ToString())) .ToArray(); _enumNameCache[enumType] = enumData; } foreach (var (val, name) in enumData) { if (name.IndexOf(substring, StringComparison.OrdinalIgnoreCase) != -1) { yield return (TEnum)val; } } }
关键说明
- 使用
StringComparison.OrdinalIgnoreCase进行大小写不敏感匹配,性能优于文化相关的匹配规则,若需适配特定文化,可替换为StringComparison.CurrentCultureIgnoreCase - 缓存版仅在首次调用时执行反射操作,后续调用直接读取缓存,大幅提升重复调用的效率
- 方法通过泛型约束确保仅接受枚举类型,避免无效调用
内容的提问来源于stack exchange,提问作者emilaz
相关产品推荐
相关产品推荐

