如何按创建时间排序目录数组,实现旧目录在ComboBox顶部显示?
调整Session目录在ComboBox中的显示顺序
当前C# WinForms项目中,GetSessionsFolders方法负责筛选包含非空Lightning子目录的Session目录并添加到comboBox1,构造函数创建新Session目录后也会直接添加到该组件。现需修改两处代码,让最早创建的旧目录显示在顶部,最新创建的目录显示在底部(按创建时间正序排列)。
修改1:调整GetSessionsFolders方法的排序逻辑
原方法未按创建时间排序,需先筛选符合条件的目录,再按创建时间升序排列后添加到ComboBox:
private void GetSessionsFolders() { comboBox1.Items.Clear(); string rootFolder = lightningsDirectoryTextBox.Text; string[] subDirectories = Directory.GetDirectories(rootFolder); // 筛选有效Session目录并附带创建时间 var validSessions = subDirectories .Select(dir => new { FullPath = dir, CreationTime = Directory.GetCreationTime(dir), SessionName = Path.GetFileName(dir).Substring(8) // 截取"Session_"后的名称 }) .Where(item => Path.GetFileName(item.FullPath).StartsWith("Session_") && Directory.GetDirectories(item.FullPath).Any(subDir => subDir.Contains("Lightning") && Directory.GetFiles(subDir).Length > 0 ) ) .OrderBy(item => item.CreationTime) // 按创建时间升序,最早的在前 .ToList(); // 批量添加排序后的目录名 foreach (var session in validSessions) { comboBox1.Items.Add(session.SessionName); sessionDirectories.Add(session.FullPath); // 更新sessionDirectories集合 } // 默认选中最新的目录(最后一项) if (comboBox1.Items.Count > 0) { comboBox1.SelectedIndex = comboBox1.Items.Count - 1; } }
关键修改点:
- 用
Select封装目录的路径、创建时间和会话名称,便于后续排序 - 新增
OrderBy(item => item.CreationTime)实现按创建时间正序排列 - 统一在排序完成后再添加到ComboBox,避免顺序混乱
修改2:调整构造函数的目录添加逻辑
原构造函数先添加目录名再创建目录,需调整顺序,并保持新目录添加到ComboBox末尾:
string folder = String.Format(@"Session_{0:dddd dd.MM.yyyy} At {0:HH.mm tt}", DateTime.Now); string folderDateTime = Path.Combine(lightningsDirectoryTextBox.Text, folder); // 先创建目录,再处理显示逻辑 Directory.CreateDirectory(folderDateTime); // 提取会话名称 int index = folder.IndexOf("Session_"); string sessionFolder = folder.Substring(index + 8); // 将新目录添加到ComboBox末尾,确保最新目录在底部 comboBox1.Items.Add(sessionFolder); // 默认选中最新创建的目录 comboBox1.SelectedIndex = comboBox1.Items.Count - 1;
关键修改点:
- 调整代码顺序,先创建目录再添加到ComboBox,逻辑更严谨
- 保持
Add方法将新目录置于ComboBox末尾,符合"旧目录在前、新目录在后"的需求
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

