C#按数字顺序排序Dictionary键值,按序解析SQL脚本文件夹
解决方案:按数字顺序迭代SQL脚本文件夹
这问题我太有共鸣了!我们团队维护SQL脚本版本库时也遇到过一模一样的需求——必须严格按数字文件夹的顺序执行脚本,避免出现依赖错误。针对你用Dictionary存储后需要按数字顺序迭代的场景,给你两个靠谱的方案:
方案1:从根源解决——用SortedDictionary替代普通Dictionary
普通的Dictionary<TKey, TValue>是无序的,而SortedDictionary<int, TValue>会自动按键的数值大小排序,完美匹配你的需求。
举个代码示例(假设你用C#):
// 初始化按整数键排序的字典 var scriptFolderDict = new SortedDictionary<int, List<string>>(); // 遍历0-12的文件夹(这里模拟获取文件夹列表) foreach (var folder in Directory.GetDirectories(@"你的脚本根目录")) { var folderName = Path.GetFileName(folder); // 把文件夹名转成整数当键,确保顺序 if (int.TryParse(folderName, out int folderKey)) { // 读取文件夹里的SQL脚本文件 var sqlScripts = Directory.GetFiles(folder, "*.sql").ToList(); scriptFolderDict.Add(folderKey, sqlScripts); } } // 迭代时自动按0→12的顺序处理 foreach (var kvp in scriptFolderDict) { Console.WriteLine($"正在处理文件夹 {kvp.Key} 的脚本:"); foreach (var scriptPath in kvp.Value) { var sqlContent = File.ReadAllText(scriptPath); // 这里执行你的SQL语句构建逻辑 Console.WriteLine($" 加载脚本:{Path.GetFileName(scriptPath)}"); } }
方案2:如果已经用了普通Dictionary,就先排序键再迭代
要是你已经基于普通Dictionary<string, ...>写了部分代码不想重构,那可以在迭代前把键转成整数排序,再按排序后的顺序遍历:
// 假设你已经有了普通字典,键是文件夹名字符串 var scriptFolderDict = new Dictionary<string, List<string>>(); // ... 这里是填充字典的代码 ... // 先把键转成整数并排序 var sortedFolderKeys = scriptFolderDict.Keys .Select(key => int.Parse(key)) .OrderBy(key => key); // 按排序后的键顺序处理 foreach (var key in sortedFolderKeys) { var folderName = key.ToString(); var sqlScripts = scriptFolderDict[folderName]; // 执行脚本处理逻辑 Console.WriteLine($"处理文件夹 {folderName}..."); }
额外小贴士
- 一定要加
int.TryParse的判断,防止文件夹名不是纯数字的情况(比如误命名的文件夹),避免程序崩溃。 - 如果你的脚本执行有依赖关系,除了按文件夹顺序,最好在脚本里加版本标记,执行时做校验,确保不会跳步执行。
内容的提问来源于stack exchange,提问作者as.beaulieu
相关产品推荐
相关产品推荐

