【问题标题】:How to compare two hash table values in C#如何在 C# 中比较两个哈希表值
【发布时间】:2015-02-13 05:08:17
【问题描述】:

我需要比较 2 个哈希表值。我可以分别使用 Containskey 和 ConatinsValue 方法比较键和值。是否可以在单个语句中同时比较键和值。需要以有效的方式检查给定的键值对是否存在于哈希表中。任何人都可以为此提出解决方案吗? 提前致谢

【问题讨论】:

  • 你是指两个不同的哈希表中的相同值,还是同一个哈希表中的两个不同的值,但使用不同的键存储?通常不需要同时检查键和值:您是否评估过一种交换键和值的反向哈希表?您是否尝试过其他类,例如 hashset 或 dictionary ?

标签: c# hashtable


【解决方案1】:

没有。因为您首先需要确定两个列表中是否存在相同的键。然后,如果两者都存在,则要比较实际值。这涉及两步过程。即使您找到了一种可以使用的方法,在幕后它也会执行两步过程。根据您的问题,我认为您的意思是您有两个单独的哈希表实例。

另一方面,如果您可以保证每个可能的值都生成一个唯一的散列,那么表中散列的存在就意味着它的值与您要比较的值相同。那么你只需要判断key是否在表中,额外的比较值的步骤是多余的。

【讨论】:

    【解决方案2】:

    不清楚你在问什么。您要检查某个键值对是否在 both Hashtable 对象中吗?或者您是否有来自一个 Hashtable 对象的一对,您想检查它是否存在于另一个对象中?

    第一个不可能在单个语句中完成,除非您为此目的编写自己的辅助方法。也就是说,这样做是个好主意,并且应该正确编写辅助方法,即有效地访问数据。

    正确实现此功能的第一步是修复您的代码,使其使用Dictionary<TKey, TValue> 而不是Hashtable。如果没有实际的代码,就不可能知道TKeyTValue 使用什么类型,所以这里有一个适用于任何类型的辅助方法示例:

    static bool KeyValuePairExistsInBoth<TKey, TValue>(Dictionary<TKey, TValue> dict1, Dictionary<TKey, TValue> dict2, TKey key, TValue value)
    {
        TValue value1, value2;
    
        if (!dict1.TryGetValue(key, out value1) || !dict2.TryGetValue(key, out value2))
        {
            return false;
        }
    
        return value.Equals(value1) && value.Equals(value2);
    }
    

    这里的重要方面是使用TryGetValue() 方法,它允许您在一次调用中检查键是否存在并检索该键的值。

    如果您只需在第二个集合中检查您从第一个集合中检索到的键值对是否存在,那么您可以直接在第二个集合上使用 TryGetValue() 方法,然后然后将返回的值与第一个集合中的值进行比较。与上面的非常相似,但是您当然不需要检查第一个集合中是否存在该对,因为这是您首先得到它的地方。

    【讨论】:

    • 较短但可读性较差是这样的: return dict1.TryGetValue(key, out value1) && dict2.TryGetValue(key, out value2)) && value.Equals(value1) && value.Equals(值2);
    【解决方案3】:

    应该这样做:

    hash1[key] == hash2[key]
    

    如果键在两者中具有相同的值,或者在两者中都缺失,则为 true。

    【讨论】:

    • 如果集合中存在键,我们不需要关心异常吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 2021-07-19
    • 2011-09-12
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    相关资源
    最近更新 更多