您似乎想同时检查键和值是否相等。如果两者不匹配,则视为差异。这给您带来了一些问题,因为这种差异无法在哈希表中表示。考虑以下
- ht1:键=
"bob"
值=42
- ht2:键=
"bob"
值=13
这里的关键是相同的,但价值是不同的。为了存储每个差异,生成的结构需要能够为同一个键包含 2 个不同的值。这对于Hashtable
. 不同的ArrayList
条目中的一个可能是本练习的更好选择。
真的有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>
来代替?