C#中Hashtable的部分字符串匹配查询问题
在C# Hashtable中实现键的部分字符串匹配查询
Hashtable本身没有内置的部分字符串匹配查询方法——它的快速查找依赖完整键的哈希值,ContainsKey()也只能检查完整键是否存在。但你可以通过以下两种方式实现你要的逻辑:
1. 遍历所有键进行匹配
直接遍历Hashtable的Keys集合,逐个检查键是否包含目标子串(比如你的tokennumber):
Hashtable myHashtable = new Hashtable(); // 先假设Hashtable已填充数据 string targetToken = "7463"; foreach (string key in myHashtable.Keys) { if (key.Contains(targetToken)) { // 找到匹配的键,执行你的逻辑 var matchedValue = myHashtable[key]; // do something } }
注意:这种方法的缺点是需要遍历所有键,数据量大时性能会明显下降,因为完全没用到哈希表的快速查找特性。
2. 优化存储结构(推荐频繁查询场景)
如果经常需要按tokennumber查询,建议额外维护一个反向映射结构,避免每次都遍历:
// 主Hashtable存储完整键对应的数据 Hashtable mainTable = new Hashtable(); // 反向字典:用tokennumber映射到对应的完整键 Dictionary<string, string> tokenToFullKey = new Dictionary<string, string>(); // 添加数据时同步更新两个结构 string cardNum = "1234"; string tokenNum = "7463"; string fullKey = $"{cardNum},{tokenNum}"; mainTable.Add(fullKey, "你的数据"); tokenToFullKey.Add(tokenNum, fullKey); // 查询时直接通过反向字典快速获取完整键 if (tokenToFullKey.TryGetValue("7463", out string matchedFullKey)) { if (mainTable.ContainsKey(matchedFullKey)) { var value = mainTable[matchedFullKey]; // do something } }
这种方法查询性能和ContainsKey()一样快,只是插入数据时需要多维护一个字典,适合频繁按tokennumber查询的场景。
另外补充:如果你的项目基于.NET 2.0及以上版本,更推荐用泛型的Dictionary<string, TValue>替代非泛型的Hashtable,类型更安全,性能也更优,上面的逻辑同样适用。
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

