如何测试C#Hashtable是否包含特定的键/值对?

时间:2009-03-19 17:26:36

标签: c# hashtable

我在传输表时将一堆所谓的唯一项ID存储为密钥,将文件位置存储为哈希表中的值。当我正在运行它时,我需要确保它们的键/位置对是唯一的或抛出错误消息。我有哈希表设置并加载值,但我不确定要测试什么:

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 个答案:

答案 0 :(得分:11)

试试这个:

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;
    }    
}

答案 1 :(得分:4)

如果您使用的是DictionaryTryGetValue方法会有所帮助。我不认为对于已经弃用的Hashtable类,有一种更好的方法。

object value;
if (dic.TryGetValue("key", out value) && value == thisValue)
  // found duplicate

答案 2 :(得分:3)

if (check_for_duplicates.ContainsKey(item["ItemID"]) &&
    check_for_duplicates[item["ItemID"]] == item["Path"])
{
    //throw error
}

答案 3 :(得分:3)

ContainsKey是最好的方法。

如果您不被迫使用.NET 1.1,我将使用.NET 2.0中引入的词典。

从性能上来说,它比Hashtable好得多,并且是强类型的。

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

betterThanAHash.ContainsKey("MyKey");

答案 4 :(得分:2)

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

答案 5 :(得分:2)

为什么不使用Dictionary

如果您尝试Add Dictionary中已存在的密钥,则会抛出ArgumentException。

通过这种方式,您可以在添加副本时捕获副本,而不是稍后执行check_for_duplicates测试。

答案 6 :(得分:1)

有点取决于items数组是什么......你会想要这样的东西:

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

假设该项目是某种形式的查找。实际上,您需要使用类型系统来构建项目,或者通过索引实际访问任何值。

答案 7 :(得分:1)

您没有说出您使用的是什么版本的内容。你有必要使用Hashtable和HashSet吗?如果您的数据结构不允许,则无需检查重复项。另见:

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

除此之外,如何在Hashtable中完成同样的事情的问题已在这里得到解答。我只是指出,如果你首先禁止它,你不需要做所有的病理检查。