【问题标题】:Retrieve value from a hashtable with dynamic key使用动态键从哈希表中检索值
【发布时间】:2014-02-27 09:57:40
【问题描述】:

我有一个哈希表“Param”,其中包含动态创建的键。 例如
键:chkbox_1 值:1
键:chk_box_2 值:2
键:chk_box_3 值
等等。

现在我想获取 LIKE "chkbox_" 的所有键值 我不能做 Param.ContainsKey["chkbox_" + id ] 因为我不知道“id”部分。

所以基本上我想做一些类似 Param.ContainsKey LIKE "chkbox_" 的事情。

最好的方法是什么?

谢谢

【问题讨论】:

  • 是非泛型HashTable还是泛型Dictionary<TKey, TValue>
  • 那你为什么在你的问题中加入HashTable
  • 我的错,我在想别的事。它实际上是一个非泛型 Hashtable。

标签: c# .net dictionary hashtable


【解决方案1】:

HashTableDictionary<TKey, TValue> 都要求您知道执行快速O(1) 值查找的密钥。如果您不知道密钥,则必须遍历整个集合并检查所有密钥以找到您要查找的内容。

您应该考虑将您的收藏更改为例如SortedList,这将允许您在 O(log n) 时间内找到带有 LIKE 'Prefix%' 谓词的项目,而不是 O(n) 用于标准线性搜索。 p>

【讨论】:

    【解决方案2】:

    您必须遍历所有对:

    var values = dict.Where(kvp => kvp.Key.StartsWith("chkbox_"))
        .Select(kvp => kvp.Value);
    

    如果您使用的是非泛型 HashTable,则必须强制转换:

    IEnumerable<object> values = dict.Cast<DictionaryEntry>()
        .Where(de => ((string)de.Key).StartsWith("chkbox_"))
        .Select(de => de.Value);
    

    【讨论】:

    • @Mithil - 如果可能,我建议使用通用集合,但如果您投射,您可以使用 Hashtable,请参阅更新。
    • 李,我是 LINQ 的新手。你能告诉我你为什么将密钥转换为“复选框”吗?
    • @Mithil - 抱歉,我以为你的键是复选框,如果它们是字符串,你可以改为使用它。
    猜你喜欢
    • 2014-01-02
    • 1970-01-01
    • 2011-01-28
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    相关资源
    最近更新 更多