1

我正在制作一个比较两个哈希表的函数,我想保持这些表的差异。因此,如果它们都包含 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;
}
4

2 回答 2

1

您似乎想同时检查键和值是否相等。如果两者不匹配,则视为差异。这给您带来了一些问题,因为这种差异无法在哈希表中表示。考虑以下

  • ht1:键="bob"值=42
  • ht2:键="bob"值=13

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

真的有3种情况需要考虑

  1. 两个表包含相同的键但具有不同的值
  2. 左边的桌子有钥匙但没有右边
  3. 右表有钥匙但没有左

第 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;
}

注意:Hashtable并且ArrayList此时基本上已弃用。为什么不使用Dictionary<TKey, TValue>andList<T>来代替?

于 2013-08-09T03:30:13.107 回答
0

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

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

  2. 将此要求的所有负面评估存储在您将用作结果的第三个哈希表中。这将使用总共 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;
}

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

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

于 2013-08-09T03:15:50.990 回答