Использование Visual C# для работы с коллекцией HashTable

В этой статье описывается использование HashTable коллекции в Visual C#.

Исходная версия продукта: Visual C#
Исходный номер базы знаний: 309357

Сводка

Так как хэширование устраняет необходимость в дорогостоящем поиске данных для получения данных, можно использовать хэширование для эффективного извлечения данных. Хэширование использует значение самого ключа для поиска данных.

Библиотеки базовых классов предлагают класс, определенный HashTableSystem.Collections в пространстве имен, поэтому вам не нужно кодировать собственные хэш-таблицы.

Действия по сборке примера

Коллекция HashTable сохраняет пару (Key, Value) и использует Key для хэширования и получения расположения хранилища. Является Key неизменяемым и не может содержать повторяющиеся записи в HashTable. В этом примере используется несколько экземпляров простого Person класса для хранения в HashTable. Фамилия используется в Keyкачестве .

  1. Откройте Microsoft Visual Studio и создайте проект приложения Windows Forms в Visual C#. Форма Form1 добавляется в проект по умолчанию.

  2. В Обозреватель решений щелкните правой кнопкой мыши имя проекта, наведите указатель мыши на пункт Добавить, а затем выберите Класс, чтобы добавить модуль класса. Class1 по умолчанию добавляется в проект.

  3. Замените любой код в модуле 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 объединения.

  4. Создайте объект уровня 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?>
    
  5. На следующих шагах используйте Add метод объекта , чтобы добавить три Person объекта Hashtable в try-catch блок.Hashtable Блок try-catch перехватывает исключение и отображает сообщение, если существуют повторяющиеся ключи:

    1. Поместите элемент управления Button в Form1 и измените свойство Text на Добавить элементы.

    2. Дважды щелкните кнопку, чтобы открыть окно "Код", и вставьте следующий код в 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);
      }
      
  6. Объект Hashtable предоставляет индексатор. На следующих шагах выполните индекс с Key помощью , чтобы получить доступ к значению, хранящейся в хэш-расположении:

    1. Добавьте элемент управления Button в Form1 и измените свойство Name на Get Items.

    2. Дважды щелкните кнопку и вставьте следующий код в 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);
      }
      
  7. На следующих шагах Remove используйте метод , чтобы удалить один элемент из HashTable коллекции:

    1. Добавьте элемент управления Button в Form1 и измените свойство Text на Remove Item.

    2. Дважды щелкните кнопку и вставьте следующий код в Button3_Click событие:

      <?xm-deletion_mark author="v-bobbid" time="20080711T173011-0800" data="if (MyTable.Count == 0)
      {
          MessageBox.Show(&quot;There are no items in HashTable&quot;);
      }
      else
      {
          MessageBox.Show(&quot;The count before removing an Item is&quot; + &quot; &quot; + MyTable.Count);
          MessageBox.Show(&quot;Removing value stored at key value (Burris)&quot;);
          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?>
      
  8. На следующих шагах перечислите элементы, хранящиеся в HashTable коллекции:

    1. Добавьте элемент управления Button в Form1 и измените свойство Text на Перечисление.

    2. Дважды щелкните кнопку и вставьте следующий код в Button4_Click событие:

      <?xm-deletion_mark author="v-bobbid" time="20080711T174252-0800"
      data="IDictionaryEnumerator Enumerator;
      if (MyTable.Count == 0)
      MessageBox.Show(&quot;The hashtable is empty&quot;);
      else
      {
          MessageBox.Show(&quot;Enumerating through the Hashtable collection&quot;);
          Enumerator = MyTable.GetEnumerator();
      
          while (Enumerator.MoveNext())
          {
              MessageBox.Show(Enumerator.Value.ToString());
          }
      }
      
      ICollection MyKeys;
      
      if (MyTable.Count == 0)
       MessageBox.Show(&quot;The hashtable is empty&quot;);
      else
      {
          MessageBox.Show(&quot;Accessing keys property to return keys collection&quot;);
          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 перечисления по ключам.

  9. На следующих шагах используйте Clear метод , чтобы очистить :HashTable

    1. Добавьте элемент управления Button в Form1 и измените свойство Text на Clear.

    2. Дважды щелкните кнопку и вставьте следующий код в Button5_Click событие:

      MyTable.Clear();
      MessageBox.Show("HashTable is now empty");
      
  10. Выполните следующие действия, чтобы создать и запустить приложение.

    1. Выберите Добавить элементы. В коллекцию HashTable добавляются три Person объекта.
    2. Выберите Получить элементы. Индексатор получает элементы в HashTable коллекции. Отображаются три только что добавленных элемента.
    3. Выберите Удалить элемент. Элемент в расположении Burris ключа удаляется.
    4. Выберите Перечислить. IDictionaryEnumerator перечисляет элементы в HashTable коллекции, а Keys свойство HashTable объекта возвращает коллекцию ключей.
    5. Нажмите кнопку Очистить. Все элементы удаляются из HashTable коллекции.

Примечание.

Приведенные здесь примеры компаний, организаций, продуктов, доменных имен, адресов электронной почты, логотипов, людей, мест и событий являются вымышленными. Никакая связь с реальной компанией, организацией, продуктом, доменным именем, адресом электронной почты, логотипом, человеком, местами или событиями не предназначена или не должна быть выведена.