我意识到C#和.NET通常已经有了Hashtable和Dictionary类.
任何人都可以在C#中演示Hashtable的实现吗?
更新:为了澄清,我不是必须寻找一个完整的实现,只是一个哈希表的核心功能的例子(即添加,删除,按键查找).
问题问题很久之后,所以我不希望获得多少代表.但是我决定编写自己的基本示例(少于90行代码)会很有趣:
public struct KeyValue{ public K Key { get; set; } public V Value { get; set; } } public class FixedSizeGenericHashTable { private readonly int size; private readonly LinkedList >[] items; public FixedSizeGenericHashTable(int size) { this.size = size; items = new LinkedList >[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 > linkedList = GetLinkedList(position); foreach (KeyValue 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 > linkedList = GetLinkedList(position); KeyValue item = new KeyValue () { Key = key, Value = value }; linkedList.AddLast(item); } public void Remove(K key) { int position = GetArrayPosition(key); LinkedList > linkedList = GetLinkedList(position); bool itemFound = false; KeyValue foundItem = default(KeyValue ); foreach (KeyValue item in linkedList) { if (item.Key.Equals(key)) { itemFound = true; foundItem = item; } } if (itemFound) { linkedList.Remove(foundItem); } } protected LinkedList > GetLinkedList(int position) { LinkedList > linkedList = items[position]; if (linkedList == null) { linkedList = new LinkedList >(); items[position] = linkedList; } return linkedList; } }
这是一个小测试应用程序:
static void Main(string[] args) { FixedSizeGenericHashTablehash = new FixedSizeGenericHashTable (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(); }
它不是最好的实现,但它适用于添加,删除和查找.它使用链接和简单的模数算法来查找适当的存储桶.
你看过C5系列吗?您可以下载包含哈希表的源代码.
您可以使用反射器查看.NET Hashtable的实现方式(例如在C#中)
http://www.red-gate.com/products/reflector/
当然还有类库的Mono版本:
System.Collections.Hashtable
System.Collections.Generic.Dictionary