基于指定子串包含规则的自定义字符串列表排序实现问询
按指定子串优先级排序字符串列表
核心思路是给每个字符串分配优先级权重,按权重从小到大排序,确保包含"PRX"的排在最前,其次是"ODD",最后是"EVEN",同时忽略大小写匹配子串。
实现方式一:LINQ OrderBy 结合自定义权重函数
这种方式简洁直观,适合快速实现:
using System; using System.Collections.Generic; using System.Linq; class Program { static void Main() { var originalList = new List<string> { "R10.14_R15.2.2b - Upgrade - Even", "R10.14_R15.2.2c - Upgrade - Odd", "R10.14_R15.2.2 - Upgrade - Prx" }; // 排序后的列表 var sortedList = originalList.OrderBy(s => GetPriority(s)).ToList(); // 输出验证 foreach (var item in sortedList) { Console.WriteLine(item); } } // 定义优先级规则 private static int GetPriority(string s) { if (s.IndexOf("PRX", StringComparison.OrdinalIgnoreCase) >= 0) return 0; // 最高优先级 if (s.IndexOf("ODD", StringComparison.OrdinalIgnoreCase) >= 0) return 1; if (s.IndexOf("EVEN", StringComparison.OrdinalIgnoreCase) >= 0) return 2; return 3; // 其他字符串默认最低优先级,排在最后 } }
实现方式二:自定义IComparer
如果需要复用排序逻辑,或者在List.Sort()方法中使用,可以自定义比较器:
using System; using System.Collections.Generic; public class SubstringPriorityComparer : IComparer<string> { public int Compare(string x, string y) { // 处理空字符串,默认放最后 if (x == null && y == null) return 0; if (x == null) return 1; if (y == null) return -1; var priorityX = GetPriority(x); var priorityY = GetPriority(y); return priorityX.CompareTo(priorityY); } private static int GetPriority(string s) { if (s.IndexOf("PRX", StringComparison.OrdinalIgnoreCase) >= 0) return 0; if (s.IndexOf("ODD", StringComparison.OrdinalIgnoreCase) >= 0) return 1; if (s.IndexOf("EVEN", StringComparison.OrdinalIgnoreCase) >= 0) return 2; return 3; } } // 使用示例 class Program { static void Main() { var originalList = new List<string> { "R10.14_R15.2.2b - Upgrade - Even", "R10.14_R15.2.2c - Upgrade - Odd", "R10.14_R15.2.2 - Upgrade - Prx" }; originalList.Sort(new SubstringPriorityComparer()); foreach (var item in originalList) { Console.WriteLine(item); } } }
关键注意点
- 使用
StringComparison.OrdinalIgnoreCase进行不区分大小写的子串匹配,避免因大小写差异导致匹配失败。 - 权重值越小优先级越高,确保排序顺序符合要求。
- 空字符串或不包含任何目标子串的字符串默认排在最后,可根据需求调整权重规则。
内容的提问来源于stack exchange,提问作者Bogdan Kovačević
相关产品推荐
相关产品推荐

