Ответ 1
Конечно, есть также версия Mono библиотек классов:
Я понимаю, что С# и .NET вообще уже имеют классы Hashtable и Dictionary.
Может ли кто-нибудь продемонстрировать на С# реализацию Hashtable?
Обновление: Чтобы уточнить, я не нуждаюсь в полной реализации, просто пример основных функций хэш-таблицы (например, добавление, удаление, поиск по ключу).
Конечно, есть также версия Mono библиотек классов:
Долго после того, как задан вопрос, поэтому я не ожидаю, что заработаю много репутации. Однако я решил, что было бы интересно написать мой собственный очень простой пример (менее 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;
}
}
Здесь небольшое тестовое приложение:
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();
}
Это не лучшая реализация, но она работает для добавления, удаления и поиска. Он использует chaining и простой модульный алгоритм для поиска соответствующего ведра.
Вы просмотрели C5 коллекции? Вы можете загрузить источник, который включает хеш-таблицу.
Вы можете увидеть, как реализуется .NET Hashtable (например, на С#) с использованием рефлектора
Вы можете просмотреть простое хеш-таблицу здесь, которая должна дать вам представление о простой реализации.
Отказ от ответственности: в коде есть, вероятно, несколько ошибок, но принцип тот же:)
Вы также можете посмотреть реализацию Hashtable из Mono здесь:
Это довольно подробное объяснение всех операций над HashTable http://www.dotnetperls.com/hashtable