C# ASP.NET中按原顺序对列表相似项分组实现方案问询
实现按前缀分组并保留原顺序的方法
当然可以搞定!你要的这种「按首次出现的分组归类,同时完全保留原顺序」的需求,确实不能用普通的升/降序排序——普通排序只会按字符顺序打乱原有排列,而我们需要的是稳定分组排序:既把相同前缀的元素归为一组,又保持各组在原列表中的先后顺序,组内元素也保留原有的出现顺序。
核心思路
- 先遍历原列表,记录每个前缀第一次出现的顺序(比如用字典存储前缀对应的顺序索引)
- 以这个「首次出现顺序」作为排序依据,对原列表进行排序——这样相同前缀的元素会被归到一起,且各组的顺序和原列表中首次出现的顺序一致
- 利用稳定排序特性(比如Python的
sorted、C#的OrderBy),保证组内元素的相对顺序和原列表一致
Python 实现示例
# 原列表 original_list = ["tbl1_aaa", "tbl1_bbb", "chk2_ccc", "drp3_ddd", "tbl1_eee", "txt4_fff", "chk2_ggg"] # 第一步:记录每个前缀首次出现的顺序 prefix_order = {} current_order = 0 for item in original_list: # 提取下划线前的前缀 prefix = item.split('_')[0] if prefix not in prefix_order: prefix_order[prefix] = current_order current_order += 1 # 第二步:按前缀的首次出现顺序排序 sorted_list = sorted(original_list, key=lambda x: prefix_order[x.split('_')[0]]) print(sorted_list) # 输出结果:['tbl1_aaa', 'tbl1_bbb', 'tbl1_eee', 'chk2_ccc', 'chk2_ggg', 'drp3_ddd', 'txt4_fff']
C# 实现示例
using System; using System.Collections.Generic; using System.Linq; class Program { static void Main() { // 原列表 List<string> originalList = new List<string> { "tbl1_aaa", "tbl1_bbb", "chk2_ccc", "drp3_ddd", "tbl1_eee", "txt4_fff", "chk2_ggg" }; // 记录前缀首次出现的顺序 Dictionary<string, int> prefixOrder = new Dictionary<string, int>(); int order = 0; foreach (string item in originalList) { string prefix = item.Split('_')[0]; if (!prefixOrder.ContainsKey(prefix)) { prefixOrder.Add(prefix, order++); } } // 按前缀首次出现顺序排序 List<string> sortedList = originalList.OrderBy(x => prefixOrder[x.Split('_')[0]]).ToList(); // 输出结果 foreach (string item in sortedList) { Console.WriteLine(item); } } }
为什么这个方法有效?
- 我们没有直接按前缀的字母顺序排序,而是按前缀第一次出现在原列表中的先后顺序作为排序key,这样
tbl1因为第一个出现,key为0,chk2为1,以此类推,完美保留了原列表的分组顺序。 - 稳定排序算法会保证相同key的元素,保持它们在原列表中的相对位置,所以组内的元素顺序也和原列表一致。
内容的提问来源于stack exchange,提问作者Aswini
相关产品推荐
相关产品推荐

