Использование Visual C# для работы с коллекцией HashTable
В этой статье описывается использование HashTable
коллекции в Visual C#.
Исходная версия продукта: Visual C#
Исходный номер базы знаний: 309357
Сводка
Так как хэширование устраняет необходимость в дорогостоящем поиске данных для получения данных, можно использовать хэширование для эффективного извлечения данных. Хэширование использует значение самого ключа для поиска данных.
Библиотеки базовых классов предлагают класс, определенный HashTable
System.Collections
в пространстве имен, поэтому вам не нужно кодировать собственные хэш-таблицы.
Действия по сборке примера
Коллекция HashTable
сохраняет пару (Key
, Value
) и использует Key
для хэширования и получения расположения хранилища. Является Key
неизменяемым и не может содержать повторяющиеся записи в HashTable
. В этом примере используется несколько экземпляров простого Person
класса для хранения в HashTable
. Фамилия используется в Key
качестве .
Откройте Microsoft Visual Studio и создайте проект приложения Windows Forms в Visual C#. Форма Form1 добавляется в проект по умолчанию.
В Обозреватель решений щелкните правой кнопкой мыши имя проекта, наведите указатель мыши на пункт Добавить, а затем выберите Класс, чтобы добавить модуль класса.
Class1
по умолчанию добавляется в проект.Замените любой код в модуле
Class1
следующим кодом:public class Person { public string Fname, Lname;d public Person (string FirstName, string LastName) { Fname = FirstName; Lname = LastName; } public override string ToString () { return Fname + " " + Lname; } }
Класс
Person
имеет один конструктор, который принимаетFirstName
параметры иLastName
и назначает эти параметры локальным переменным. ФункцияToString
переопределяетToString
класс дляObject
возвратаFname
иLname
объединения.Создайте объект уровня
Hashtable
формы и объявите три переменные типаPerson
. Добавьте в классForm1
следующий код.<?xm-deletion_mark author="v-bobbid" time="20080711T172143-0800" data="private Hashtable MyTable = new Hashtable(); //For simplicity, create three Person objects to add to the HashTable collection. Person Person1,Person2,Person3; "?> <?xm-insertion_mark_start author="v-bobbid" time="20080711T172143-0800"?> System.Collections.Hashtable MyTable = new System.Collections.Hashtable(); //For simplicity, create three Person objects to add to the HashTable collection. Person Person1,Person2,Person3; <?xm-insertion_mark_end?>
На следующих шагах используйте
Add
метод объекта , чтобы добавить триPerson
объектаHashtable
вtry-catch
блок.Hashtable
Блокtry-catch
перехватывает исключение и отображает сообщение, если существуют повторяющиеся ключи:Поместите элемент управления Button в Form1 и измените свойство Text на Добавить элементы.
Дважды щелкните кнопку, чтобы открыть окно "Код", и вставьте следующий код в
Button1_Click
событие:Person1 = new Person("David", "Burris"); Person2 = new Person("Johnny", "Carrol"); Person3 = new Person("Ji", "Jihuang"); //The Add method takes Key as the first parameter and Value as the second parameter. try { MyTable.Add(Person1.Lname, Person1); MyTable.Add(Person2.Lname, Person2); MyTable.Add(Person3.Lname, Person3); } catch (ArgumentException ae) { MessageBox.Show("Duplicate Key"); MessageBox.Show(ae.Message); }
Объект
Hashtable
предоставляет индексатор. На следующих шагах выполните индекс сKey
помощью , чтобы получить доступ к значению, хранящейся в хэш-расположении:Добавьте элемент управления Button в Form1 и измените свойство Name на Get Items.
Дважды щелкните кнопку и вставьте следующий код в
Button2_Click
событие://Use the indexer of the Hashtable class to retrieve your objects. The indexer takes //Key as a parameter and accesses it with the Hashed location. try { MessageBox.Show(MyTable[Person1.Lname].ToString()); MessageBox.Show(MyTable[Person2.Lname].ToString()); MessageBox.Show(MyTable[Person3.Lname].ToString()); } catch (NullReferenceException ex) { MessageBox.Show("Key not in Hashtable"); MessageBox.Show(ex.Message); }
На следующих шагах
Remove
используйте метод , чтобы удалить один элемент изHashTable
коллекции:Добавьте элемент управления Button в Form1 и измените свойство Text на Remove Item.
Дважды щелкните кнопку и вставьте следующий код в
Button3_Click
событие:<?xm-deletion_mark author="v-bobbid" time="20080711T173011-0800" data="if (MyTable.Count == 0) { MessageBox.Show("There are no items in HashTable"); } else { MessageBox.Show("The count before removing an Item is" + " " + MyTable.Count); MessageBox.Show("Removing value stored at key value (Burris)"); Remove the object that is stored at the Key value Person1.Lname. MyTable.Remove(Person1.Lname); } "?> <?xm-insertion_mark_start author="v-bobbid" time="20080711T173011-0800"?>if (MyTable.Count == 0) { MessageBox.Show("There are no items in HashTable"); } else { MessageBox.Show("The count before removing an Item is" + " " + MyTable.Count); MessageBox.Show("Removing value stored at key value (Burris)"); // Remove the object that is stored at the Key value Person1.Lname. MyTable.Remove(Person1.Lname); } <?xm-insertion_mark_end?>
На следующих шагах перечислите элементы, хранящиеся в
HashTable
коллекции:Добавьте элемент управления Button в Form1 и измените свойство Text на Перечисление.
Дважды щелкните кнопку и вставьте следующий код в
Button4_Click
событие:<?xm-deletion_mark author="v-bobbid" time="20080711T174252-0800" data="IDictionaryEnumerator Enumerator; if (MyTable.Count == 0) MessageBox.Show("The hashtable is empty"); else { MessageBox.Show("Enumerating through the Hashtable collection"); Enumerator = MyTable.GetEnumerator(); while (Enumerator.MoveNext()) { MessageBox.Show(Enumerator.Value.ToString()); } } ICollection MyKeys; if (MyTable.Count == 0) MessageBox.Show("The hashtable is empty"); else { MessageBox.Show("Accessing keys property to return keys collection"); MyKeys = MyTable.Keys; foreach (object Key in MyKeys) { MessageBox.Show(Key.ToString()); } } "?> <?xm-insertion_mark_start author="v-bobbid" time="20080711T174252-0800"?> System.Collections.IDictionaryEnumerator Enumerator; if (MyTable.Count == 0) MessageBox.Show("The hashtable is empty"); else { MessageBox.Show("Enumerating through the Hashtable collection"); Enumerator = MyTable.GetEnumerator(); while (Enumerator.MoveNext()) { MessageBox.Show(Enumerator.Value.ToString()); } } System.Collections.ICollection MyKeys; if (MyTable.Count == 0) MessageBox.Show("The hashtable is empty"); else { MessageBox.Show("Accessing keys property to return keys collection"); MyKeys = MyTable.Keys; foreach (object Key in MyKeys) { MessageBox.Show(Key.ToString()); } } <?xm-insertion_mark_end?>
Этот код объявляет переменную типа
IDictionaryEnumerator
и вызываетGetEnumerator
методHashTable
коллекции. При возвращенномEnumerator
коде выполняется перечисление через элементы в коллекции и используетсяKeys
метод дляHashTable
перечисления по ключам.
На следующих шагах используйте
Clear
метод , чтобы очистить :HashTable
Добавьте элемент управления Button в Form1 и измените свойство Text на Clear.
Дважды щелкните кнопку и вставьте следующий код в
Button5_Click
событие:MyTable.Clear(); MessageBox.Show("HashTable is now empty");
Выполните следующие действия, чтобы создать и запустить приложение.
- Выберите Добавить элементы. В коллекцию
HashTable
добавляются триPerson
объекта. - Выберите Получить элементы. Индексатор получает элементы в
HashTable
коллекции. Отображаются три только что добавленных элемента. - Выберите Удалить элемент. Элемент в расположении
Burris
ключа удаляется. - Выберите Перечислить.
IDictionaryEnumerator
перечисляет элементы вHashTable
коллекции, аKeys
свойствоHashTable
объекта возвращает коллекцию ключей. - Нажмите кнопку Очистить. Все элементы удаляются из
HashTable
коллекции.
- Выберите Добавить элементы. В коллекцию
Примечание.
Приведенные здесь примеры компаний, организаций, продуктов, доменных имен, адресов электронной почты, логотипов, людей, мест и событий являются вымышленными. Никакая связь с реальной компанией, организацией, продуктом, доменным именем, адресом электронной почты, логотипом, человеком, местами или событиями не предназначена или не должна быть выведена.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по