我正在创建一个比较两个哈希表的函数,我希望保持这些表的不同。因此,如果它们都包含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;
}
答案 0 :(得分:1)
好像你想检查密钥和值是否相等。如果两者都不匹配则认为是差异。这会给您带来一些问题,因为这种差异无法在哈希表中表示。请考虑以下
"bob"
value = 42
"bob"
value = 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>
和List<T>
呢?
答案 1 :(得分:0)
如果两个哈希表都包含键和值
从您希望保留的其中一个哈希表中删除值作为结果(这样您将删除所有重复项)。这只会使用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;
}
编辑: 正如另一个答案所述:您不能在生成的哈希表中将相同的密钥存储两次。我的印象是你会将一个哈希表的数据存储到结果哈希表中,这意味着你仍然可以使用我的方法。
但是,如果你想保留两个条目,那么你将不得不寻找不同的结构。