Как проверить, содержит ли C # Hashtable определенную пару ключ / значение? - PullRequest
7 голосов
/ 19 марта 2009

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

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 ]

11 голосов
/ 19 марта 2009

Попробуйте это:

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 или выше, рассмотрите вариант использования Generics, например:

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;
    }    
}
4 голосов
/ 19 марта 2009

Если бы вы использовали Dictionary, вместо этого помог бы метод TryGetValue. Я не думаю, что есть действительно лучший способ для довольно устаревшего Hashtable класса.

object value;
if (dic.TryGetValue("key", out value) && value == thisValue)
  // found duplicate
3 голосов
/ 19 марта 2009

ContainsKey - лучший метод.

Если вы не обязаны использовать .NET 1.1, я бы использовал словарь, представленный в .NET 2.0.

Это намного лучше, чем Hashtable с точки зрения производительности и строго типизирован.

Dictionary<string, int> betterThanAHash = new Dictionary<string, int>();

betterThanAHash.ContainsKey("MyKey");
3 голосов
/ 19 марта 2009
if (check_for_duplicates.ContainsKey(item["ItemID"]) &&
    check_for_duplicates[item["ItemID"]] == item["Path"])
{
    //throw error
}
2 голосов
/ 19 марта 2009

Почему бы не использовать Dictionary вместо этого?

Это вызовет ArgumentException, если вы попытаетесь Add ключ, который уже существует в Dictionary.

Таким образом, вы можете поймать дубликат в момент его добавления, а не выполнять тест check_for_duplicates позже.

2 голосов
/ 19 марта 2009
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
    } 
}

Я верю, что это то, что вы ищете.

РЕДАКТИРОВАТЬ - Похоже, я был избит на удар: P

1 голос
/ 17 апреля 2009

Вы не сказали, какую версию вещей вы использовали. Есть ли причина, по которой вы должны использовать Hashtable против HashSet? Вам не нужно было бы проверять наличие дубликатов, если ваша структура данных их не допускает. Смотри также:

http://www.vcskicks.com/csharp_data_structures2.html

Кроме этого, вопрос о том, как выполнить то же самое в Hashtable, уже был дан ответ здесь. Я просто указываю на то, что вам не нужно выполнять всю патологическую проверку, если вы запрещаете это в первую очередь.

1 голос
/ 19 марта 2009

Это как бы зависит от массива элементов ... вам понадобится что-то вроде:

check_for_duplicates.ContainsValue(item["Path"]);

Предполагая, что предмет представляет собой некоторую форму поиска. На самом деле вам нужно использовать объект или использовать систему типов для фактического доступа к любым значениям через индекс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...