如何将字符串中的Enum值替换为对应索引以实现按Enum顺序排序
替换逻辑问题修复方案
核心错误点
你的代码存在3个导致替换不生效的问题:
- C# 中
string是不可变类型,Replace()方法不会修改原字符串,只会返回替换后的新字符串,你没有接收返回值,所以s1、s2始终是原始值 s2赋值错误,你写成了s2 = tx.Text,拿到的和s1是同一份值,完全没有用到y参数对应的节点文本- 循环条件中使用的
positions是未定义变量,你应该以myEnums数组的长度作为循环边界
修正后完整代码
public int Compare(object x, object y) { TreeNode tx = x as TreeNode; TreeNode ty = y as TreeNode; string s1 = tx.Text; string s2 = ty.Text; MyEnum[] myEnums = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().ToArray(); for (int i = myEnums.Length - 1; i >= 0; i--) { MyEnum myEnum = myEnums[i]; string str = myEnum.ToString(); string index = ((int)myEnum).ToString(); // 接收Replace返回值更新字符串 s1 = s1.Replace(str, index); s2 = s2.Replace(str, index); } return string.Compare(s1, s2); }
可选优化建议
如果后续枚举项数量超过10个,直接拼接数字会出现位数不同导致的排序错误(比如10会排在2前面),可以将索引格式化为固定长度字符串,示例如下:
string index = ((int)myEnum).ToString("D2");
如果枚举项名称存在互相包含的情况(比如同时存在CAR和CARRIAGE),可以改用正则全字匹配替换,避免误替换。
内容的提问来源于stack exchange,提问作者Steve W
相关产品推荐
相关产品推荐

