如何存储含重复值的成对字符串数据?技术方案咨询
解决脚本名称与触发时间成对存储(支持重复)的方案
嘿,这个场景我太有共鸣了!确实,Dictionary在这儿完全派不上用场——不管你把脚本名称还是触发时间当键,只要出现重复值,后面的条目就会直接覆盖前面的,根本存不下同一脚本多次触发、或者多脚本同一时间触发的情况。
给你几个实用的解决方案,从基础存储到高效查询都覆盖到了:
1. 基础存储:自定义类 + List
最直接的方式是先定义一个类来封装每一组脚本名称和触发时间,然后用List来存储所有条目:
// 定义存储单个脚本调度的类 public class ScriptSchedule { public string ScriptName { get; set; } // 推荐用TimeSpan代替字符串,避免格式错误,也方便时间计算 public TimeSpan TriggerTime { get; set; } } // 初始化存储列表 var scriptSchedules = new List<ScriptSchedule> { new ScriptSchedule { ScriptName = "数据备份脚本", TriggerTime = new TimeSpan(2, 0, 0) }, new ScriptSchedule { ScriptName = "数据备份脚本", TriggerTime = new TimeSpan(14, 0, 0) }, new ScriptSchedule { ScriptName = "日志清理脚本", TriggerTime = new TimeSpan(2, 0, 0) } };
这种方式完全支持重复值,不管是脚本名称重复还是触发时间重复,所有条目都能完整保存。
2. 高效查询:用分组字典优化检索
如果需要频繁根据触发时间或脚本名称查询对应的条目,可以用LINQ把列表分组转换成字典,提升查询效率:
按触发时间分组(快速找某一时间的所有脚本)
// 构建"触发时间 -> 对应脚本列表"的字典 var timeToScripts = scriptSchedules .GroupBy(s => s.TriggerTime) .ToDictionary(g => g.Key, g => g.ToList()); // 查询凌晨2点触发的所有脚本 if (timeToScripts.TryGetValue(new TimeSpan(2, 0, 0), out var scriptsAt2Am)) { foreach (var script in scriptsAt2Am) { Console.WriteLine($"脚本:{script.ScriptName},触发时间:{script.TriggerTime}"); } }
按脚本名称分组(快速找某一脚本的所有触发时间)
// 构建"脚本名称 -> 对应触发时间列表"的字典 var scriptToTimes = scriptSchedules .GroupBy(s => s.ScriptName) .ToDictionary(g => g.Key, g => g.Select(s => s.TriggerTime).ToList()); // 查询"数据备份脚本"的所有触发时间 if (scriptToTimes.TryGetValue("数据备份脚本", out var backupTimes)) { foreach (var time in backupTimes) { Console.WriteLine($"触发时间:{time}"); } }
3. 额外提示:用TimeSpan代替字符串的好处
如果用TimeSpan类型存储触发时间,相比字符串有几个优势:
- 避免手动输入格式错误(比如写成"2:00"而不是"02:00:00")
- 方便进行时间比较、计算(比如判断当前时间是否接近触发时间)
- 序列化/反序列化时更可靠
当然,如果你的业务场景必须用字符串格式,把TimeSpan改成string类型就行,逻辑完全通用。
内容的提问来源于stack exchange,提问作者Ben R
相关产品推荐
相关产品推荐

