我在传输表时将一堆所谓的唯一项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
}
}
答案 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)
如果您使用的是Dictionary
,TryGetValue
方法会有所帮助。我不认为对于已经弃用的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中完成同样的事情的问题已在这里得到解答。我只是指出,如果你首先禁止它,你不需要做所有的病理检查。