当前,我正在学习散列及其目的,并获得了这段代码,以便我可以了解存储桶的方式以及散列的发生方式。唯一的问题是,这本书将编码放在Set<T>
类中,而没有告诉我如何在Main()
中实现它!
这是给定的代码
class Set<T>
{
private List<T>[] buckets = new List<T>[100];
public void Insert(T item)
{
int bucket = GetBucket(item.GetHashCode());
if (Contains(item, bucket))
{
return;
}
if (buckets[bucket] == null)
{
buckets[bucket] = new List<T>();
}
buckets[bucket].Add(item);
}
public bool Contains(T item)
{
return Contains(item, GetBucket(item.GetHashCode()));
}
private int GetBucket(int hashcode)
{
unchecked
{
return (int)((uint)hashcode%(uint)buckets.Length);
}
}
private bool Contains(T item, int bucket)
{
if (buckets[bucket] != null)
{
foreach (T member in buckets[bucket])
{
if (member.Equals(item))
{
return true;
}
}
}
return false;
}
我知道如何创建类的普通实例:
MyClass objectname = new MyClass();
但是当我尝试创建Set<T>
类的实例(顺便说一句,我知道它的泛型)时,编译器会说T
不存在。
究竟如何从Set<T>
访问Main()
?
答案 0 :(得分:0)
您的问题实际上来自对C#中泛型的理解。
一个通用类用于处理我们不知道但可以操纵的数据。
以一个列表为例。您可以操纵字符串,整数,双精度数,浮点数的列表...这就是List<T>
类已在.Net Framework中实现的原因。关键是用计划在运行时使用的类型替换T。
因此,如果我知道要使用整数列表,我将使用List<int>
。
与您的Set<T>
类相同。 T代表“您想要的任何类型”。
因此,如果要使用它,则必须这样做:
Set<int> MySetOfInteger = new Set<int>();
Set<String> MySetOfStrings = new Set<String>();
这实际上会生成两个不同的类,但是基于相同的模板。
希望它能澄清一点。