如何在C#中按程序名称对四个等长字符串数组排序?
解决方案:按程序名称排序已安装程序信息
一、无需合并数组的最优实现(推荐)
你之前用类封装数据的思路是对的,但代码存在类定义错误——不该在实体类里嵌套List。正确做法是先定义单独的实体类封装单条程序的所有属性,再把数组数据转成该类的集合,最后直接排序。
步骤1:定义实体类
// 仅用于存储单条程序的完整信息 public class InstalledProgram { public string Name { get; set; } public string Publisher { get; set; } public string InstallDate { get; set; } public string InstallLocation { get; set; } }
步骤2:转换数组数据并排序
// 创建集合存储所有程序信息 List<InstalledProgram> programList = new List<InstalledProgram>(); // 遍历数组,将对应位置的属性封装到实体类中 for (int i = 0; i < Programs_WMI_name.Length; i++) { // 跳过空数据(避免数组长度99但实际数据不足的情况) if (string.IsNullOrEmpty(Programs_WMI_name[i])) continue; programList.Add(new InstalledProgram { Name = Programs_WMI_name[i], Publisher = Programs_WMI_publisher[i], InstallDate = Programs_WMI_installdate[i], InstallLocation = Programs_WMI_installlocation[i] }); } // 按程序名称的字母顺序排序 var sortedPrograms = programList.OrderBy(p => p.Name).ToList();
处理完成后,sortedPrograms就是按名称排序后的程序集合,直接遍历即可获取每条程序的所有属性。
二、合并为二维数组的实现(不推荐,可读性差)
如果一定要用二维数组,可按以下步骤操作:
- 将四个一维数组合并为二维数组,每行对应一个程序的四个属性
- 基于二维数组的第一列(程序名称)完成排序
代码示例
// 初始化二维数组:99行,4列(对应名称、发布者、安装日期、路径) string[,] programsArray = new string[99, 4]; // 填充二维数组 for (int i = 0; i < 99; i++) { programsArray[i, 0] = Programs_WMI_name[i]; programsArray[i, 1] = Programs_WMI_publisher[i]; programsArray[i, 2] = Programs_WMI_installdate[i]; programsArray[i, 3] = Programs_WMI_installlocation[i]; } // 将二维数组转换为可排序的结构(二维数组无法直接用OrderBy) var sortableItems = Enumerable.Range(0, 99) .Select(i => new { OriginalIndex = i, ProgramName = programsArray[i, 0] }) .Where(item => !string.IsNullOrEmpty(item.ProgramName)) // 过滤空项 .OrderBy(item => item.ProgramName) .ToList(); // 根据排序后的索引生成有序二维数组 string[,] sortedArray = new string[sortableItems.Count, 4]; for (int i = 0; i < sortableItems.Count; i++) { int originalIndex = sortableItems[i].OriginalIndex; sortedArray[i, 0] = programsArray[originalIndex, 0]; sortedArray[i, 1] = programsArray[originalIndex, 1]; sortedArray[i, 2] = programsArray[originalIndex, 2]; sortedArray[i, 3] = programsArray[originalIndex, 3]; }
这种方式代码繁琐,后续读取属性需依赖索引对应,可读性和维护性远不如实体类集合方案,因此更推荐第一种实现方式。
内容的提问来源于stack exchange,提问作者Mdarende
相关产品推荐
相关产品推荐

