2015-02-13 2 views
2

Мне нужно сравнить 2 значения хэш-таблицы. Я могу сравнить ключ и значение, используя методы Containskey и ConatinsValue соответственно. Можно ли сравнивать как ключ, так и значение в одном выражении. необходимо проверить, действительно ли заданная пара значений ключей существует в хэш-таблице. Может ли кто-нибудь предложить решение для этого? Заранее спасибоКак сравнить два значения хэш-таблицы в C#

+0

Вы имеете в виду одно и то же значение внутри двух разных хеш-таблиц или два разных значения в одной и той же хеш-таблице, но с разными ключами? Обычно нет необходимости проверять как ключ, так и значение: вы оценили какую-то обратную хеш-таблицу, в которой обменялись ключом и значением? Вы пробовали другие классы, такие как hashset или dictionary? –

ответ

-1

Это должно сделать это:

hash1[key] == hash2[key] 

Это правда, если ключ находится либо в обоих с тем же значением, или он отсутствует в обоих.

+0

Не нужно ли нам заботиться об исключении, если в коллекции присутствует ключ? –

2

Нет. Потому что сначала вам нужно определить, находится ли тот же ключ в обоих списках. Затем, если в обоих вы хотите сравнить фактические значения. Это предполагает двухэтапный процесс. Даже если вы нашли один метод для использования, под обложками он будет выполнять двухэтапный процесс. С вашего вопроса, я думаю, вы имеете в виду, что у вас есть два отдельных экземпляра хэш-таблицы.

С другой стороны, если вы можете гарантировать, что каждое возможное значение генерирует уникальный хэш, тогда простое существование хэша в таблице означает, что его значение совпадает с тем, которое вы хотите сравнить. Затем вам нужно только определить, находится ли ключ в таблице, а дополнительный шаг сравнения значений является избыточным.

1

Непонятно, что вы просите. Вы хотите проверить, находится ли какая-то пара ключ-значение в иHashtable объектов? Или у вас есть пара из одного объекта Hashtable, который вы хотите проверить на наличие своего присутствия в другом?

Первое невозможно сделать в одном заявлении, если только вы не написали свой собственный вспомогательный метод для этой цели. Тем не менее, это хорошая идея, и этот вспомогательный метод должен быть написан правильно, то есть эффективно получать данные.

Первым шагом в реализации этого правильного является исправить ваш код, чтобы он использовал Dictionary<TKey, TValue> вместо Hashtable. Без фактического кода, это невозможно знать, какие типы вы хотите использовать для TKey и TValue, так вот пример вспомогательного метода, который будет работать для любых типов:

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() непосредственно во второй коллекции, а затем сравните возвращаемое значение со значением из первой коллекции. Очень похоже на вышесказанное, но, конечно, вам не нужно проверять первую коллекцию на наличие пары, так как именно там вы ее получили.

+0

Короткое, но менее читаемое значение выглядит примерно так: return dict1.TryGetValue (key, out value1) && dict2.TryGetValue (key, out value2)) && value.Equals (value1) && value.Equals (value2); – Jannik