保持两个哈希表之间的差异

时间:2013-08-09 03:10:56

标签: c# .net data-structures hashtable

我正在创建一个比较两个哈希表的函数,我希望保持这些表的不同。因此,如果它们都包含100个密钥并且只有2个被更改,我希望新的哈希表只能等于那2个差异。

这就是我所拥有的。我真的迷失了如何做(保持差异)

private Hashtable CompareHashtables(Hashtable ht1, Hashtable ht2)
{
    Hashtable ResultsOfCompare = new Hashtable();
    foreach (DictionaryEntry entry in ht1)
    {
        if (ht2.ContainsKey(entry.Key) && ht2.ContainsValue(entry.Value) == false)
        {
            //Keep differences

        }
    }
    return ResultsOfCompare;
}

2 个答案:

答案 0 :(得分:1)

好像你想检查密钥和值是否相等。如果两者都不匹配则认为是差异。这会给您带来一些问题,因为这种差异无法在哈希表中表示。请考虑以下

  • ht1:key = "bob" value = 42
  • ht2:key = "bob" value = 13

这里的关键是相同的,但价值是差异。要存储每个差异,结果结构需要能够为同一个键包含2个不同的值。对于Hashtable来说,这是不可能的。不同的ArrayList个条目可能是此练习的更好选择。

确实有3个案例要考虑

  1. 两个表都包含相同的键但具有不同的值
  2. 左表有键但不对
  3. 右表有键但未离开
  4. 第2项和第3项可以折叠在一起但是很难将1折叠到这个包中。您可能需要另一种数据结构来指导您表中的差异

    struct Difference { 
      internal readonly bool IsValueDifferent; 
      internal readonly object Key;
      internal readonly object Value;
      internal readonly object OtherValue;
    
      internal Difference(object key, object value) { 
        Key = key;
        Value = value;
        IsValueDifferent = false;
      }
    
      internal Difference(object key, object value, object otherValue) { 
        Key = key;
        Value = value;
        OtherValue = otherValue;
        IsValueDifferent = true;
      }
    }
    

    通过这个你可以代表案件。

    private Hashtable CompareHashtables(Hashtable ht1, Hashtable ht2) {
      ArrayList diffList = new ArrayList();
      foreach (DictionaryEntry entry in ht1) {
        object value = ht2[entry.Key];
        if (value == null) { 
          diffList.Add(new Difference(entry.Key, entry.Value));
        } else if (!value.Equals(entry.Value)) {
          diffList.Add(new Difference(entry.Key, entry.Value, value));
        }
      }
    
      foreach (DictionaryEntry entry in ht2) {
        object value = ht1[entry.Key];
        if (value == null) {
          diffList.Add(new Difference(entry.Key, entry.Value));
        }
      }
    
      return diffList;
    }
    

    注意:HashtableArrayList此时基本上已弃用。为什么不使用Dictionary<TKey, TValue>List<T>呢?

答案 1 :(得分:0)

如果两个哈希表都包含键和值

  1. 从您希望保留的其中一个哈希表中删除值作为结果(这样您将删除所有重复项)。这只会使用2个哈希表,但它也会破坏其中一个表的数据。

  2. 将此要求的每个否定评估存储在您将用作结果的第三个哈希表中。这将使用总共3个哈希表,但不会删除原始数据。

  3. 使用方法2的示例:

    private Hashtable CompareHashtables(Hashtable ht1, Hashtable ht2){
        Hashtable resultsOfCompare = new Hashtable();
    
        foreach (DictionaryEntry entry in ht1) {
            if (!(ht2.ContainsKey(entry.Key) && ht2.ContainsValue(entry.Value))) {
                resultsOfCompare.Add(entry.Key, entry.Value);
            }
        }
        return resultsOfCompare;
    }
    

    编辑: 正如另一个答案所述:您不能在生成的哈希表中将相同的密钥存储两次。我的印象是你会将一个哈希表的数据存储到结果哈希表中,这意味着你仍然可以使用我的方法。

    但是,如果你想保留两个条目,那么你将不得不寻找不同的结构。