[英]What is an example of a Hashtable implementation in C#?
I realize C# and .NET in general already has the Hashtable and Dictionary classes.我意识到 C# 和 .NET 通常已经具有 Hashtable 和 Dictionary 类。
Can anyone demonstrate in C# an implementation of a Hashtable?任何人都可以在 C# 中演示 Hashtable 的实现吗?
Update: To clarify, I'm not ncessarily looking for a complete implementation, just an example of the core features of a hashtable (ie add,remove, find by key).更新:澄清一下,我不一定要寻找完整的实现,只是哈希表核心功能的一个示例(即添加、删除、按键查找)。
Long after the question has been asked, so I don't expect to earn much rep.问题被问了很久之后,所以我不希望获得太多的代表。 However I decided it would be fun to write my own very basic example (in less than 90 lines of code):但是,我认为编写自己的非常基本的示例(不到 90 行代码)会很有趣:
public struct KeyValue<K, V>
{
public K Key { get; set; }
public V Value { get; set; }
}
public class FixedSizeGenericHashTable<K,V>
{
private readonly int size;
private readonly LinkedList<KeyValue<K,V>>[] items;
public FixedSizeGenericHashTable(int size)
{
this.size = size;
items = new LinkedList<KeyValue<K,V>>[size];
}
protected int GetArrayPosition(K key)
{
int position = key.GetHashCode() % size;
return Math.Abs(position);
}
public V Find(K key)
{
int position = GetArrayPosition(key);
LinkedList<KeyValue<K, V>> linkedList = GetLinkedList(position);
foreach (KeyValue<K,V> item in linkedList)
{
if (item.Key.Equals(key))
{
return item.Value;
}
}
return default(V);
}
public void Add(K key, V value)
{
int position = GetArrayPosition(key);
LinkedList<KeyValue<K, V>> linkedList = GetLinkedList(position);
KeyValue<K, V> item = new KeyValue<K, V>() { Key = key, Value = value };
linkedList.AddLast(item);
}
public void Remove(K key)
{
int position = GetArrayPosition(key);
LinkedList<KeyValue<K, V>> linkedList = GetLinkedList(position);
bool itemFound = false;
KeyValue<K, V> foundItem = default(KeyValue<K, V>);
foreach (KeyValue<K,V> item in linkedList)
{
if (item.Key.Equals(key))
{
itemFound = true;
foundItem = item;
}
}
if (itemFound)
{
linkedList.Remove(foundItem);
}
}
protected LinkedList<KeyValue<K, V>> GetLinkedList(int position)
{
LinkedList<KeyValue<K, V>> linkedList = items[position];
if (linkedList == null)
{
linkedList = new LinkedList<KeyValue<K, V>>();
items[position] = linkedList;
}
return linkedList;
}
}
Here's a little test application:这是一个小测试应用程序:
static void Main(string[] args)
{
FixedSizeGenericHashTable<string, string> hash = new FixedSizeGenericHashTable<string, string>(20);
hash.Add("1", "item 1");
hash.Add("2", "item 2");
hash.Add("dsfdsdsd", "sadsadsadsad");
string one = hash.Find("1");
string two = hash.Find("2");
string dsfdsdsd = hash.Find("dsfdsdsd");
hash.Remove("1");
Console.ReadLine();
}
It's not the best implementation, but it works for Add, Remove and Find.这不是最好的实现,但它适用于添加、删除和查找。 It uses chaining and a simple modulo algorithm to find the appropriate bucket.它使用链接和简单的模算法来找到合适的桶。
Have you looked at the C5 collections ?你看过C5 collections吗? You can download the source which includes a hash table.您可以下载包含 hash 表的源代码。
You can see how the .NET Hashtable is implemented (for example in C#) using reflector您可以看到 .NET Hashtable 是如何使用反射器实现的(例如在 C# 中)
http://www.red-gate.com/products/reflector/ http://www.red-gate.com/products/reflector/
There is also the Mono version of the class libraries of course:当然还有 Mono 版本的 class 库:
You could also look at the Hashtable implementation from Mono here:您还可以在此处查看Mono的 Hashtable 实现:
http://anonsvn.mono-project.com/viewvc/trunk/mcs/class/corlib/System.Collections/Hashtable.cs?revision=111788&view=markup http://anonsvn.mono-project.com/viewvc/trunk/mcs/class/corlib/System.Collections/Hashtable.cs?revision=111788&view=markup
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.