تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
HashTable in C#.NET
#1
بسم الله الرحمن الرحيم
وصلى الله على محمد وآله الطاهرين

السلام عليكم ورحمة الله وبركاته



HashTable: احدى الكائنات التابعة لمجال الاسماء System. Collection في لغة الC# يستخدم زوج من المفاتيح والقيم لخزن البيانات فيها ,حيث تستخدم المفتاح لإيجاد القيمة المطلوبة في عمليات البحث. و تكون قيمة المفتاح ثابتة لا تتغير.

كيفية تعريف Instance من HashTable:
اولا يجب اضافة مجال الاسماء System.Collection ومن ثم نقوم بتعريف Instance من الكائن HashTable:

PHP كود :
using System.Collections

Hashtable htable = new Hashtable(); 

ومن الممكن ان نحدد كمية البيانات التي نريد اضافتها ,ذلك لان كائن الHashTable لديه 15 دالة OverLoading ومن ضمنها دالة تحديد كمية البيانات المراد اضافتها.

PHP كود :
Hashtable.Hashtable(int capacity

كيفية اضافة البيانات الى HashTable:
تكون الاضافة الى HashTable عن طريق اما الاسناد المباشر للمفاتيح (حيث تعتبر المفاتيح بمثابة Index في هذا النوع) او عن طريق الدالة Add حيث تقبل هذه الدالة مدخلين من نوع object صيغتها: ( Add(object key, object value) ) او عن طريق اسناد قيم اولية لها.

ملاحظه: بالإمكان ان تكون الKey والValue أي نوع من انواع المتغيرات لأنه كما قلنا كلاهما من نوع object.

اليك هذا المثال لتوضيح الشرح:

PHP كود :
Hashtable htable;
//أما هكذا
htable = new Hashtable() { { 3"jamal" } }; // اسناد قيم اولية 
//او
htable.Add(1"sajad"); //  Addاستخدام دالة ال
htable.Add(2"ahmed");
//او
htable[3] = "jameel"// استخدام الاسناد المباشر 

في السطر الاخير سيأخذ المفتاح (3) العنصر "jameel" مكان العنصر "jamal" ,يجوز ذلك في حالة الاسناد المباشر ,وتسمى بإعادة الاسناد (reassign)
ويجب الملاحظة انه لا يجوز اضافة قيم بنفس المفتاح مرتين اذا كنت تستخدم دالة الAdd. وأيضا من الممكن ان تكون القيم والمفاتيح من انواع اخرى او من نفس النوع من المتغيرات كالتالي:

PHP كود :
htable.Add("s""ss");
htable.Add("d"6); 

فكما تلاحظون في السطر الاول المفتاح والقيمة من نفس النوع وفي السطر الثاني المفتاح من نوع نصي والقيمة من نوع رقمي.


كيفية جلب البيانات من الHashTable:
بما ان مدخلات الHashtable.Add من نوع object لذا يجب عمل Casting اثناء جلب البيانات من الHashtable او مايعرف بالBoxing (هي عملية تحويل بيانات من نوع object او من نوع مرجعي الى بيانات من انواع اخرى كال int, char, …..) ,حيث يتم جلب القيم عنه طريق المفتاح.

اليك كيفية ذلك:

اولا جلب البيانات عن طريق الIndex والIndex هنا يمثل المفتاح

PHP كود :
string value htable[1] as string

السطر اعلاه يقوم بجلب قيمة المفتاح (1) وخزنها في المتغير النصي (s).
او جلب جميع البيانات هكذا:

PHP كود :
foreach (string value in hashtable.Values

MessageBox.Show(value); 
}
// او
foreach (DictionaryEntry entry in htable)
        {
            
string value entry.Value as string
            int key 
= (int)entry.Key;                                
            
MessageBox.Show(key.ToString() + " :" value);
        }
//او
IDictionaryEnumerator en hshTable.GetEnumerator();
while (
en.MoveNext())
{
      
string value en.Value.ToString(); 


البحث عن القيم:
يتم البحث عن القيم عن طريق الدالة ContainsValue حيث تأخذ هذه الدالة مدخل واحد من نوع object يمثل القيمة المراد البحث عنها.

PHP كود :
if (htable.ContainsValue("sajad"))
{
   
MessageBox.Show("Ok");


ويتم البحث عن المفاتيح عن طريق دالة الContainsKey او دالة Contains.
حيث ترجع هذه الدوال True اذا كانت القيمة او المفتاح موجودا في الHashtable و ترجع False عند عدم ايجاد القيمة او المفتاح المراد البحث عنها.

حذف القيم:
يتم حذف القيم باستخدام الدال Remove حيث تأخـــذ هذه الدالة باراميتر واحد من نوع object يمثل قيمة المفتاح. اذ يتم حذف القيم عن طريق ذكر المفتاح.

PHP كود :
htable.Remove(3); 

هنا يتم حذف قيمة المفتاح (3).

ومن الدوال المهمة ايضا دالة الClear لحذف جميع العناصر ودالة CopyTo لنسخ الازواج من قيم ومفاتيح الى مصفوفة ذات بعد واحد من نوع DictionaryEntry ودالة الCount لجب عدد الازواج الموجودة في الHashtable من (Key& Value).

اليك هذه الامثلة:

PHP كود :
int c htable.Count;//  معرفة عدد الازواج
DictionaryEntry[] dic = new DictionaryEntry[c];//DictionaryEntry مصفوفة من نوع 
htable.CopyTo(dic0);//dicالى  htable  نسخ من 
MessageBox.Show(dic[0].Value.ToString());
htable.Clear();// مسح جميع القيم 

او استخدام دالة الCopyTo لنسخ القيم فقط بدون المفاتيح هكذا:

PHP كود :
object[] = new object[c];
htable.Values.CopyTo(o0);//object نسخ القيم الى مصفوفة من نوع 
MessageBox.Show(o[0].ToString()); 
الرد }}}
تم الشكر بواسطة: Abdullah0991 , @@أبورائد@@ , Abu Ehab , asemshahen5
#2
جزاك الله أخي Sajad

جميل منك ان تضئ على فئات مهمة ,, يهملها معظمنا مع انها توفر الوقت والجهد
سبحان الله وبحمده سبحان الله العظيم

الرد }}}
تم الشكر بواسطة: Sajad , asemshahen5
#3
السلام عليكم

وجزاك بالمثل اخي العزيز

شكرا على التعليق الجميل والمرور
الرد }}}
تم الشكر بواسطة: asemshahen5
#4
شرح رائع من شخص اروع ...

ولكن يبدو لي ان HashTable شبيهة جدا بDictionary

مالفرق !؟
الرد }}}
تم الشكر بواسطة: Sajad , asemshahen5
#5
بارك الله فيك اخي العزيز

نعم التشابه كبير بين الفئتين وخصوصا انهما يعتمدان المفتاح والقيمة

لكن الفرق الرئيسي هو انه لا يتم تحديد نوع المفتاح ونوع القيمة في الـHashTable
بينما في الـDictionary يجب تحديد نوع القيمة والمفتاح

فتعرف Instance من الـHashTable يكون هكذا:

PHP كود :
var ht = new HashTable(); 

بينما للـDictionary يكون هكذا:

PHP كود :
var dic = new Dictionary<Data TypeData Type>(); 

بدلا من الـDataType تكتب النوع

الرد }}}
تم الشكر بواسطة: الشاكي لله , asemshahen5


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  Dealing with Hashtable in CSharp Sajad 6 3,572 02-05-13, 06:03 PM
آخر رد: Sajad

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم