Как проверить, содержит ли хэш-таблица C# определенную пару ключ/значение?
Я храню кучу предположительно уникальных идентификаторов элементов в качестве ключа и местоположения файлов в качестве значения в хэш-таблице при обходе таблицы. Пока я его просматриваю, мне нужно убедиться, что пара ключ/местоположение уникальна или выдает сообщение об ошибке. У меня настроена хэш-таблица и я загружаю значения, но не уверен, что тестировать:
Hashtable check_for_duplicates = new HashTable();
foreach (object item in items)
{
if (check_for_duplicates.ContainsKey(item["ItemID"]) &&
//what goes here? Would be contains item["Path"] as the value for the key)
{
//throw error
}
}
8 ответов
попробуйте это:
Hashtable check_for_duplicates = new HashTable();
foreach (object item in items)
{
if (check_for_duplicates.ContainsKey(item["ItemID"]) &&
check_for_duplicates[item["ItemID"]].Equals(item["Path"]))
{
//throw error
}
}
кроме того, если вы используете .NET 2.0 или выше, рассмотрите возможность использования дженериков, например:
List<Item> items; // Filled somewhere else
// Filters out duplicates, but won't throw an error like you want.
HashSet<Item> dupeCheck = new HashSet<Item>(items);
items = dupeCheck.ToList();
на самом деле, я только что проверил, и похоже, что HashSet-это только .NET 3.5. Словарь был бы более подходящим для 2.0:
Dictionary<int, string> dupeCheck = new Dictionary<int, string>();
foreach(Item item in items) {
if(dupeCheck.ContainsKey(item.ItemID) &&
dupeCheck[item.ItemID].Equals(item.Path)) {
// throw error
}
else {
dupeCheck[item.ItemID] = item.Path;
}
}
если вы используете Dictionary
вместо TryGetValue
способ поможет. Я не думаю, что есть действительно лучший способ для довольно много устаревших Hashtable
класса.
object value;
if (dic.TryGetValue("key", out value) && value == thisValue)
// found duplicate
if (check_for_duplicates.ContainsKey(item["ItemID"]) &&
check_for_duplicates[item["ItemID"]] == item["Path"])
{
//throw error
}
ContainsKey-лучший метод.
Если вы не вынуждены использовать .NET 1.1, я бы использовал словарь, представленный в .NET 2.0.
это намного лучше, чем хэш-таблица от производительности и строго типизирована.
Dictionary<string, int> betterThanAHash = new Dictionary<string, int>();
betterThanAHash.ContainsKey("MyKey");
Почему бы не использовать Dictionary
?
это вызовет исключение ArgumentException, если вы попытаетесь Add
ключ, который уже существует в Dictionary
.
таким образом, вы можете поймать дубликат в момент его добавления, а не выполнять check_for_duplicates
тест позже.
Hashtable check_for_duplicates = new HashTable();
foreach (object item in items)
{
if (check_for_duplicates.ContainsKey(item["ItemID"]) && check_for_duplicates[item["ItemID"]] == item["Path"])
{
//throw error
}
}
Я считаю, что это то, что вы ищете.
EDIT-похоже, меня избили до удара: P
Это зависит от того, что массив элементов... вы захотите что-то вроде:
check_for_duplicates.ContainsValue(item["Path"]);
предполагая, что элемент является некоторой формой поиска. На самом деле вам нужно литье элемента или использование системы типов для фактического доступа к любым значениям через индекс.
вы не сказали, какую версию вещей вы использовали. Есть ли причина, по которой вы должны использовать Hashtable против HashSet? Вам не нужно будет проверять наличие дубликатов, если ваша структура данных не позволяет их. См. также:
http://www.vcskicks.com/csharp_data_structures2.html
кроме этого, вопрос о том, как выполнить то же самое в Hashtable уже был дан ответ здесь. Я просто указываю, что тебе не нужно делать все патологическая проверка, если вы запрещаете это в первую очередь.