关于字典的问题

huangxiaofei 2008-02-08 09:29:17
我按照PROFESSIONAL C#中的例子的思路写了一个字典的类,但是我用HASHTABLE对象怎么也无法查询,我不知道问题在哪里,下面是程序.(我在调试的时候发现HashTable对象中是有值的,而且我定义的查找键key也是能够读入用户输入信息的,但是ht[key]返回的却总是null,即使key输入存在的键值也返回null.究竟是哪里出了问题?)

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;



namespace DictionaryTest
{
class DataID
{
private string message;

public DataID(string message)
{
this.message = message;
}

public override string ToString()
{
return message;
}

public override int GetHashCode()
{
return message.GetHashCode();
}

public override bool Equals(object obj)
{
DataID rhs = obj as DataID;
if (message.Equals(rhs))
return true;
else return false;
}

}

class Data
{
private int number;
private string name;
private DataID id;

public Data(int number, string name, DataID id)
{
this.number = number;
this.name = name;
this.id = id;
}

public override string ToString()
{
return "ID:" + id.ToString() + " " + "number:" + this.number.ToString() + " " + "name:" + name;
}

}

class Program
{
static void Main(string[] args)
{
Hashtable ht = new Hashtable(31);
DataID[] id = new DataID[10];
Data[] d = new Data[10];
for(int i = 0;i<10;i++)
{
id[i] = new DataID("Test" + i.ToString());
d[i] = new Data(i, "Name" + i.ToString(), id[i]);
ht.Add(id[i], d[i]);
Console.WriteLine(d[i].ToString());
}
Console.WriteLine("This Program is used to test hash table function.");
Console.WriteLine("Now we have already create a Hash table about data array,just input the key value of data you want to find, hash table will automatically find the matched value.");
Console.WriteLine("Hash table has " + ht.Count + " records");

while (true)
{
Console.WriteLine("Please input key.");
string input = Console.ReadLine();
if ("x" == input)
break;
DataID key = new DataID(input);
object result;
result = ht[key];
if (null == result)
Console.WriteLine("Cannot find such result!");
else
Console.WriteLine(((Data)result).ToString());
}


Console.ReadKey();
}
}
}
...全文
161 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangxiaofei 2008-02-11
  • 打赏
  • 举报
回复
哈!果然如hdt所说,我在覆盖Equals()方法的时候出了问题,应该使用message来判断!其他的意见也很有见地,谢谢大家的精辟的见解!
真相重于对错 2008-02-09
  • 打赏
  • 举报
回复
改成

public override bool Equals(object obj)
{
DataID rhs = obj as DataID;
if (message.Equals(rhs.message))
return true;
else return false;
}
真相重于对错 2008-02-09
  • 打赏
  • 举报
回复
public override bool Equals(object obj)
{
DataID rhs = obj as DataID;
if (message.Equals(rhs))//这里你比较的不对,你用一个string和一个DataId比较永远不会相等
return true;
else return false;
}
真相重于对错 2008-02-09
  • 打赏
  • 举报
回复
每个元素都是一个存储在 DictionaryEntry 对象中的键/值对。键不能为空引用(在 Visual Basic 中为 Nothing),但值可以。

要重写 Object.GetHashCode 方法(或 IHashCodeProvider 接口)和 Object.Equals 方法(或 IComparer 接口),需要有被 Hashtable 用作键的对象。方法和接口的实现必须以相同的方式处理大小写;否则,Hashtable 的行为可能不正确。例如,创建 Hashtable 时,您必须配合使用 CaseInsensitiveHashCodeProvider 类(或任何不区分大小写的 IHashCodeProvider 实现)和 CaseInsensitiveComparer 类(或任何不区分大小写的 IComparer 实现)。

此外,如果该键存在于 Hashtable 中,那么当使用相同参数调用这些方法时,这些方法必须生成相同的结果。还有一种方式是使用具有 IEqualityComparer 参数的 Hashtable 构造函数。如果键相等性只是引用相等性,则 Object.GetHashCode 和 Object.Equals 的继承实现将满足需要。

只要键对象用作 Hashtable 中的键,它们就必须是永远不变的。

当把某个元素添加到 Hashtable 时,将根据键的哈希代码将该元素放入存储桶中。该键的后续查找将使用键的哈希代码只在一个特定存储桶中搜索,这将大大减少为查找一个元素所需的键比较的次数。

Hashtable 的加载因子确定元素与存储桶的最大比率。加载因子越小,平均查找速度越快,但消耗的内存也增加。默认的加载因子 1.0 通常提供速度和大小之间的最佳平衡。当创建 Hashtable 时,也可以指定其他加载因子。

当向 Hashtable 添加元素时,Hashtable 的实际加载因子将增加。当实际加载因子达到指定的加载因子时,Hashtable 中存储桶的数目自动增加到大于当前 Hashtable 存储桶数两倍的最小质数。

Hashtable 中的每个键对象必须提供其自己的哈希函数,可通过调用 GetHash 访问该函数。但是,可将任何实现 IHashCodeProvider 的对象传递到 Hashtable 构造函数,而且该哈希函数用于该表中的所有对象。

Hashtable 的容量是 Hashtable 可拥有的元素数。Hashtable 的默认初始容量为零。随着向 Hashtable 中添加元素,容量通过重新分配按需自动增加。

lextm 2008-02-09
  • 打赏
  • 举报
回复
而且判断是不是字典里面有东西,应该用
Hashtable.Contains
或者IDictionary.ContainsKey
不要用de.key.ToString()==input之类的原始方式吧,哈哈。
syeerzy 2008-02-09
  • 打赏
  • 举报
回复
好几年没有使用过hashTable了 既然有泛型了,何还用这个Hashtable类呢???

IDictionary<TKey,TValue> 泛型接口多好啊,呵呵
Mittermeyer 2008-02-09
  • 打赏
  • 举报
回复
是不是大小写相关的问题。
stg609 2008-02-08
  • 打赏
  • 举报
回复
你用以下方法试试,手写没有进行过调试。
foreach(DictionaryEntry de in ht)
{
if(de.key.ToString()==input)
{
result = de.value;
}
}

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧