如何通过字符串获取枚举项索引并实现星期推算功能
解决方案
首先先提醒你定义的枚举命名存在问题:枚举名Month意为月份,但成员是星期枚举值,建议修改为WeekDay避免后续业务逻辑混淆。
1. 字符串转枚举索引的简便实现
根据你使用的技术栈不同,有两种常用的简便实现方案:
方案1:C#/.NET 环境(内置枚举解析支持)
.NET 框架自带枚举解析方法,不需要手动写映射逻辑,直接调用内置API即可:
// 修正后的枚举定义 enum WeekDay { Mon, Tue, Wed, Thu, Fri, Sat, Sun } // 字符串转枚举获取索引示例 string inputDay = "Mon"; if (Enum.TryParse<WeekDay>(inputDay, out WeekDay dayEnum)) { int index = (int)dayEnum; // 此处index值即为0,符合需求 }
如果需要频繁调用字符串转枚举的逻辑,可以预先构建映射字典提升性能:
// 全局只需要初始化一次 Dictionary<string, int> DayStrToIndex = Enum.GetNames<WeekDay>() .ToDictionary(name => name, name => (int)Enum.Parse<WeekDay>(name)); // 后续调用直接查字典,时间复杂度O(1) int index = DayStrToIndex["Mon"];
方案2:C++ 等无内置枚举解析的环境
直接预构建哈希映射表即可,实现简单性能也足够:
#include <unordered_map> #include <string> enum WeekDay { Mon, Tue, Wed, Thu, Fri, Sat, Sun }; // 全局预构建映射 std::unordered_map<std::string, WeekDay> StrToWeekDay = { {"Mon", Mon}, {"Tue", Tue}, {"Wed", Wed}, {"Thu", Thu}, {"Fri", Fri}, {"Sat", Sat}, {"Sun", Sun} }; // 调用示例 int index = StrToWeekDay["Mon"]; // 得到索引0
2. nextDay函数实现
以C#为例,基于上述枚举转换逻辑,配合模7运算即可实现需求,同时支持正负天数偏移:
public string NextDay(string day, int number) { // 校验输入的星期字符串合法性 if (!Enum.TryParse<WeekDay>(day, out WeekDay currentDay)) { throw new ArgumentException("输入的星期字符串不合法", nameof(day)); } // 计算目标索引,加7再取模是为了兼容number为负数的情况 int targetIndex = ((int)currentDay + number % 7 + 7) % 7; // 将目标索引转回星期字符串返回 return Enum.GetName<WeekDay>((WeekDay)targetIndex); }
调用测试:NextDay("Mon", 2) 返回结果为Wed,和你给出的示例要求一致。
内容的提问来源于stack exchange,提问作者sunny
相关产品推荐
相关产品推荐

