C#中如何替代Switch语句简化多列表选择逻辑?
简化C#多分支Switch逻辑的两种方案
一、完全替代Switch:用字典映射消除分支
核心思路是把类型字符串和对应的列表做键值对绑定,通过字典直接查找目标列表,统一执行处理逻辑,彻底告别冗长的Switch分支,后续新增类型只需在字典里加一行即可。
实现步骤:
- 在类中初始化字典(建议在构造函数里只初始化一次,提升性能):
private readonly Dictionary<string, IEnumerable<string>> _gudListMap; public YourClassName() { _gudListMap = new Dictionary<string, IEnumerable<string>> { {"SGUD", SGUD_List_from_TreeWriter}, {"MGUD", MGUD_List_from_TreeWriter}, {"UGUD", UGUD_List_from_TreeWriter}, {"GUD4", GUD4_List_from_TreeWriter}, {"GUD5", GUD5_List_from_TreeWriter}, {"GUD6", GUD6_List_from_TreeWriter}, {"GUD7", GUD7_List_from_TreeWriter}, {"GUD8", GUD8_List_from_TreeWriter}, {"GUD9", GUD9_List_from_TreeWriter} // 新增类型直接追加键值对 }; }
- 修改
Split_List方法:
public void Split_List() { string selectedType = TagService.NC_GUD_selected_type[index_]; if (_gudListMap.TryGetValue(selectedType, out var targetList)) { // 和原逻辑一致的循环处理 for (int m = 0; m < targetList.LongCount(); m++) { Split_GUD_attr = targetList.ElementAt(m).Split(';'); k = m; } } else { // 可选:处理未知类型的场景,比如抛出异常或设置默认值 // throw new ArgumentOutOfRangeException(nameof(selectedType), "未定义的GUD类型"); } GUD_List_to_screen = Split_GUD_attr[0] + Split_GUD_attr[6] + " (" + Split_GUD_attr[1] + ")"; CNC_GUD_Out_Array_total[index_, k] = GUD_List_to_screen; }
二、必须用Switch时:抽离重复逻辑缩短分支
如果业务限制必须保留Switch,可以把每个分支里重复的循环逻辑抽成独立方法,让Switch分支只做列表传递,大幅精简代码。
实现步骤:
- 抽离重复逻辑到单独方法:
private void ProcessGudList(IEnumerable<string> targetList) { for (int m = 0; m < targetList.LongCount(); m++) { Split_GUD_attr = targetList.ElementAt(m).Split(';'); k = m; } }
- 简化后的Switch分支:
public void Split_List() { switch (TagService.NC_GUD_selected_type[index_]) { case "SGUD": ProcessGudList(SGUD_List_from_TreeWriter); break; case "MGUD": ProcessGudList(MGUD_List_from_TreeWriter); break; case "UGUD": ProcessGudList(UGUD_List_from_TreeWriter); break; case "GUD4": ProcessGudList(GUD4_List_from_TreeWriter); break; case "GUD5": ProcessGudList(GUD5_List_from_TreeWriter); break; case "GUD6": ProcessGudList(GUD6_List_from_TreeWriter); break; case "GUD7": ProcessGudList(GUD7_List_from_TreeWriter); break; case "GUD8": ProcessGudList(GUD8_List_from_TreeWriter); break; case "GUD9": ProcessGudList(GUD9_List_from_TreeWriter); break; // 新增类型只需追加一行调用 default: // 处理未知类型 break; } GUD_List_to_screen = Split_GUD_attr[0] + Split_GUD_attr[6] + " (" + Split_GUD_attr[1] + ")"; CNC_GUD_Out_Array_total[index_, k] = GUD_List_to_screen; }
额外提示
原代码中的循环逻辑会每次覆盖Split_GUD_attr,最终只有列表最后一个元素的拆分结果会被保留,k也会是最后一个元素的索引。如果你的真实需求是处理每个元素并更新数组,需要把数组赋值逻辑移到循环内部。
内容的提问来源于stack exchange,提问作者Mdarende
相关产品推荐
相关产品推荐

