Hashtable კოლექცია

Hashtable კლასი ეს არის ზოგადი დანიშნულების dictionary კოლექცია, რომელიც უზრუნველყობს, რომ კოლექციის წევრების დამისამართება მოხდეს არა რიცხვითი ინდექსით არამედ, არამედ ობიექტზე ბაზირებული key–თი.  Hashtable არის მონაცემთა სტრუქტურა, რომელიც ინახავს რაიმე სიდიდეების თანმიმდევრობას რაც იდენტიფიცირდება უნიკალური key–თი. key შეიძლება გამოყენებული იყოს მონაცემების მოსაძებნად მოცემულ კლასში. როდესაც ხდება რაიმე წევრის დამატება (ანუ ამ დროს წევრი შედგება რაიმე უნიკალური key სგან და თვითონ მნიშვნელობისაგან და ხდება კლასში ამ ორი მონაცემის ჩაწერა) დირექტორიაში ჩაწერამდე ხდება key–ს დაჭრა (hashing). დაჭრა გულისხმობს key-ს კონვერტაციას ინდექსად და მონაცემის სიდიდის დაკავშირებას მოცემულ ინდექსთან, ხოლო შესაბამისად შემდეგ მოცემული სიდიდის ჩაწერას ინდექსის შესაბამის მეხსიერების ადგილას.მარტივად რომ ვთქვათ  Hashtable არის კოლექციის მსგავსი კლასი (ამაზე ისიც მეტყველებს, რომ ის ICollection ინტერფეისის მემკვიდრეა) იმ განსხვავებით რომ მის ელემენტებთან წვდომა შეგვიძლია მოვახდინოთ არა რაიმე int–ის ტიპის ინდექსის მეშვეობით არამედ key–თი, ხოლო key შეიძლება იყოს ნებისმიერი ტიპის. ჰეშირების შედეგად კოლექციაში რაიმე წევრის მოძებნა გაცილებით სწრაფად ხდება ბინარული(ორობითი) ძებნის საშუალებით.
.net ში არის Hashtable კლასი რომელიც უზრუნველყობს Hashtable–ის მთელი ფუნქციონალურობის გამოყენებას.  ქვემოთ მოცემულია Hashtable–ზე მოქმედებების მაგალითი.

using System;
using System.Collections;

namespace HashtableDemo {
  class Program {
    static void Main(string[] args) {
      Constructors();
      AddingAnItem();
      UpdatingUsingTheKey();
      ReadingHashtableInformation();
      IteratingUsingDictionaryEntryObjects();
      Values();
      Keys();
      ContainsValue();
      CreatingAThreadSafeHashtableWrapper();
    }

    // Constructors
    static void Constructors() {
      Hashtable myData = new Hashtable();

      myData.Add("key1", "value1");

      Hashtable myCopy = new Hashtable(myData); 
      // Copies myData into myCopy
    }

    // Adding an Item
    static void AddingAnItem() {
      Hashtable myData = new Hashtable();

      myData.Add("key1", "value1");

      try {
        myData.Add("key1", "value2");//Duplicate: ArgumentException
      } catch {
        Console.WriteLine("Exception!");
      }

      try {
        myData.Add(null, "value2");//Null Key: ArgumentNullException
      } catch {
        Console.WriteLine("Exception!");
      }
    }

    // Updating Using the Key
    static void UpdatingUsingTheKey() {
      Hashtable fruit = new Hashtable();

      fruit["apple"] = "Granny Smith";   // New item created
      fruit["apple"] = "Golden Delicious"; // Item updated
      fruit["banana"] = "Cavendish";// კვადრატული ფრჩხილების შიგნით
      fruit["cherry"] = "Yamagata";// key გადაეცემა როგორც ინდექსი
    }

    // Reading Hashtable Information
    static void ReadingHashtableInformation() {
      Hashtable fruit = new Hashtable();

      fruit.Add("apple", "Granny Smith");
      fruit.Add("banana", "Cavendish");
      fruit.Add("cherry", "Yamagata");
      fruit.Add("orange", "Seville");
      //Outputs "Cavendish"
      string banana = fruit["banana"].ToString();
      //აუცილებელია ვიცოდეთ რომ Hashtable–ის ინდექსერი
      //აბრუნებს ობჯექტის ტიპის ცვლადს(ანუ ხდება Unboxing)
      Console.WriteLine(banana);         
    }

    // Iterating Using DictionaryEntry Objects
    static void IteratingUsingDictionaryEntryObjects() {
      Hashtable fruit = new Hashtable();

      fruit.Add("apple", "Granny Smith");
      fruit.Add("banana", "Cavendish");
      fruit.Add("cherry", "Yamagata");
      fruit.Add("orange", "Seville");
  //
      foreach(DictionaryEntry de in fruit)
        Console.WriteLine("{0} \t: {1}", de.Key, de.Value);

      /* OUTPUT

      cherry : Yamagata
      apple  : Granny Smith
      banana : Cavendish
      orange : Seville

      */
    }

    // Values
    static void Values() {
      Hashtable fruit = new Hashtable();

      fruit.Add("apple", "Granny Smith");
      fruit.Add("banana", "Cavendish");
      fruit.Add("cherry", "Yamagata");
      fruit.Add("orange", "Seville");

      foreach(string value in fruit.Values)
        Console.WriteLine(value);

      /* OUTPUT

      Yamagata
      Granny Smith
      Cavendish
      Seville

      */
    }

    // Keys
    static void Keys() {
      Hashtable fruit = new Hashtable();

      fruit.Add("apple", "Granny Smith");
      fruit.Add("banana", "Cavendish");
      fruit.Add("cherry", "Yamagata");
      fruit.Add("orange", "Seville");

      foreach(string value in fruit.Keys)
        Console.WriteLine(value);

      /* OUTPUT

      cherry
      apple
      banana
      orange

      */
    }

    // ContainsValue
    static void ContainsValue() {
      Hashtable fruit = new Hashtable();

      fruit.Add("apple", "Granny Smith");
      fruit.Add("banana", "Cavendish");
      fruit.Add("cherry", "Yamagata");
      fruit.Add("orange", "Seville");

      Console.WriteLine(fruit.ContainsValue("Seville"));
      //Outputs "True"
      Console.WriteLine(fruit.ContainsValue("Valencia"));
      // Outputs "False"
    }

    // Creating a Thread-Safe Hashtable Wrapper
    static void CreatingAThreadSafeHashtableWrapper() {
      Hashtable myDictionary = new Hashtable();

      Hashtable myThreadSafe = Hashtable.Synchronized(myDictionary);

      Console.WriteLine(myThreadSafe.IsSynchronized);
      // Outputs "True"
    }
  }
}

* This source code was highlighted with Source Code Highlighter.

Advertisements
This entry was posted in C# Programming. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s