C#中如何按结尾子串对字符串列表排序(无需拆分多列表)
原地按后缀分组排序的C#实现
嘿,这个需求完全不用创建多个子列表,咱们直接用List<string>.Sort()自定义比较逻辑就能搞定,原地完成排序,完美符合你的要求!
核心思路
我们只需要给Sort()方法传入一个自定义的比较规则:以每个字符串中By_开头的后缀作为排序依据,相同后缀的自然会被排在一起,相当于完成了分组。
完整代码示例
using System; using System.Collections.Generic; class Program { static void Main() { // 你的原始列表 var functionNames = new List<string> { "Get_USER_By_ID", "Get_Product_By_Name", "Get_Product_By_ID", "Get_Location_By_Name" }; // 原地排序:按By_后缀分组,相同后缀再按名称排序 functionNames.Sort((a, b) => { var suffixA = ExtractBySuffix(a); var suffixB = ExtractBySuffix(b); // 先比较后缀,后缀相同则比较完整名称(可选,按需调整) var suffixComparison = string.Compare(suffixA, suffixB, StringComparison.OrdinalIgnoreCase); return suffixComparison != 0 ? suffixComparison : string.Compare(a, b, StringComparison.OrdinalIgnoreCase); }); // 输出验证结果 foreach (var name in functionNames) { Console.WriteLine(name); } } // 辅助方法:提取字符串中以By_开头的后缀 private static string ExtractBySuffix(string input) { // 找到最后一个By_的位置(避免前面出现By_干扰) var byIndex = input.LastIndexOf("By_", StringComparison.OrdinalIgnoreCase); // 如果存在By_,返回后缀;否则返回原字符串(可按需调整无后缀的排序位置) return byIndex >= 0 ? input.Substring(byIndex) : input; } }
代码说明
- 原地排序:
List.Sort()直接修改原列表,不会创建新集合,完全符合你不想拆分多个列表的需求 - 后缀提取逻辑:用
LastIndexOf找最后一个By_的位置,避免字符串前面出现By_导致提取错误(比如如果有Get_By_User_By_ID这种极端情况也能正确提取) - 排序规则:
- 优先按
By_xxx后缀排序,相同后缀的会自动归为一组 - 后缀相同的情况下,再按完整函数名排序(这一步是可选的,如果你不需要可以直接返回
suffixComparison)
- 优先按
- 灵活性:如果后续需要修改后缀关键字(比如改成
With_),只需要修改ExtractBySuffix里的查找字符串即可;如果需要降序排序,把string.Compare的结果取反就行(比如return -suffixComparison;)
排序后结果
运行代码后,你的列表会变成:
Get_USER_By_ID Get_Product_By_ID Get_Product_By_Name Get_Location_By_Name
所有By_ID的函数排在一起,By_Name的函数排在一起,完全满足分组排序的需求~
内容的提问来源于stack exchange,提问作者user12137116
相关产品推荐
相关产品推荐

