تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
الدرس الثلاثون - ال Collections
#1
كاتب الموضوع : أحمد جمال

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

في تطبيقاتنا البرمجية المختلفة عادة ما نلجأ لعمل container يحتوي على عدة عناصر ، من اجل ذلك كانت ال array ورأينا ان بامكاننا عمل array من الارقام والنصوص واخيراً حتى من فئات مختلفة . إلا اننا فد نحتاج إلى بعض المهام الاكثر من تلك التي توفرها لنا ال array ، من اجل هذا وجدت ال collections المختلفة ، في درسنا هذا سوف نتعرف عليها إن شاء الله .
}}}
تم الشكر بواسطة:
#2
ال interfaces في System.Collections :

لو راجعنا الواجهات الموجودة في ال collection لوجدنا الواجهات التالية :

ICollection :
تحتوي هذه الواجهة على بعض النقاط الاساسية مثل ال size وال IsSynchronized وخلافه ، لها الشكل العام التالي :

C#:

كود :
public interface ICollection : IEnumerable
{
int Count { get; }
bool IsSynchronized { get; }
object SyncRoot { get; }
void CopyTo(Array array, int index);
}
vb.net:

كود :
Public Interface ICollection
Inherits IEnumerable
ReadOnly Property Count() As Integer
ReadOnly Property IsSynchronized() As Boolean
ReadOnly Property SyncRoot() As Object
Sub CopyTo(ByVal array As Array, ByVal index As Integer)
End Interface

IComparer :
تعرفنا عليها سابقا .

IDictionary :
تستخدم كما هو واضح من اسمها من اجل الادلة ، يمكن استخدامها لتخزين مثلاً بيانات الموظفين وعناوينهم بحيث يمكن العثور بعد ذلك على الشخص بدلالة اسمه او عنوانه ، تحتوي على دوال للاضافة والحذف وخلافه . الشكل العام لها بالشكل التالي :

C#:

كود :
public interface IDictionary :
ICollection, IEnumerable
{
bool IsFixedSize { get; }
bool IsReadOnly { get; }
// Type indexer; see Chapter 12 for full details.
object this[object key] { get; set; }
ICollection Keys { get; }
ICollection Values { get; }
void Add(object key, object value);
void Clear();
bool Contains(object key);
IDictionaryEnumerator GetEnumerator();
void Remove(object key);
}
vb.net:

كود :
Public Interface IDictionary
Inherits ICollection
Inherits IEnumerable
ReadOnly Property IsFixedSize() As Boolean
ReadOnly Property IsReadOnly() As Boolean
' Type indexer; see Chapter 12 for full details.
Default Property Item(ByVal key As Object) As Object
Get
End Get
Set
End Set
End Property
ReadOnly Property Keys() As ICollection
ReadOnly Property Values() As ICollection
Sub Add(ByVal key As Object, ByVal value As Object)
Sub Clear()
Function Contains(ByVal key As Object) As Boolean
Function GetEnumerator() As IDictionaryEnumerator
Sub Remove(ByVal key As Object)
End Interface
IEnumerable
تم شرحها سابقاً .

IEnumerator
تم شرحها سابقا .

IDictionaryEnumerator
لو لاحظت في IDictionary ستجد الدالة GetEnumerator ، هذا هو ال interface الخاص بهذه الدالة ، لها الشكل العام التالي :
C#:

كود :
public interface IDictionaryEnumerator : IEnumerator
{
DictionaryEntry Entry { get; }
object Key { get; }
object Value { get; }
}
vb.net:

كود :
Public Interface IDictionaryEnumerator
Inherits IEnumerator
ReadOnly Property Entry() As DictionaryEntry
ReadOnly Property Key() As Object
ReadOnly Property Value() As Object
End Interface
IHashCodeProvider
يختص باعادة ال hashcode لل collection المعين باستخدام الدالة GetHashCode .

IList

قائمة ، هذا كل ما في الأمر ، تحتوي على عدة دوال تسهل التعامل معها للاضافة والبحث والحذف وخلافه الشكل العام لها بالشكل التالي :
c#:

كود :
public interface IList :
ICollection, IEnumerable
{
bool IsFixedSize { get; }
bool IsReadOnly { get; }
object this[ int index ] { get; set; }
CHAPTER 10 n COLLECTIONS AND GENERICS 311
int Add(object value);
void Clear();
bool Contains(object value);
int IndexOf(object value);
void Insert(int index, object value);
void Remove(object value);
void RemoveAt(int index);
}
vb.net:

كود :
Public Interface IList
Inherits ICollection
Inherits IEnumerable
ReadOnly Property IsFixedSize() As Boolean
ReadOnly Property IsReadOnly() As Boolean
Default Property Item(ByVal index As Integer) As Object
Get
End Get
Set
End Set
End Property
Function Add(ByVal value As Object) As Integer
Sub Clear()
Function Contains(ByVal value As Object) As Boolean
Function IndexOf(ByVal value As Object) As Integer
Sub Insert(ByVal index As Integer, ByVal value As Object)
Sub Remove(ByVal value As Object)
Sub RemoveAt(ByVal index As Integer)
End Interface
}}}
تم الشكر بواسطة:
#3
الفئات في System.Collections :

يحتوي على الفئات التالية :


ArrayList
Hashtable
Queue
SortedList
Stack


لن نختصر في هذا الموضوع نظراً للاستخدامات المتعددة لهذه الفئات ، لذا سنبدأ في شرح كل منها ببعض الاختصار .
}}}
تم الشكر بواسطة:
#4
ArrayList :

هي قائمة array كما هو واضح من الاسم ، تتميز بنفس سمات ال array من حيث تخزينها لعدة بيانات ، اضافة لمميزات القائمة التي تسهل عمليات الاضافة والتعديل والترتيب والحذف وخلافه داخل عناصر هذه المصفوفة .

لنفترض ان لدينا فئة (سيارة) السابقة والتي تحتوي على اسم السيارة وموديلها ، كنا نعرف مصفوفة منها باستخدام الأمر التالي :
c#:

كود :
[FONT=Tahoma]Car[] carArray = new Car[4];[/FONT]

vb.net:

كود :
Dim carArray As Car() = New Car(3)

ربما لم تكن تعرف انك تحتاج لاربع سيارات فقط ، ربما تحتاج للزيادة او للنقصان ، ربما ترغب بحذف واحدة منهم من المنتصف ... الخ ، فكما ترى لا توفر لنا ال array الكثير من الخيارات لتسهيل التعامل مع هذه الخصائص ، ستحتاج لبعض الأوامر للحذف وخلافه .
بداية قم بعمل using ل System.Collection لتكون قادراً على التعامل المباشر معها لاحقاً .
c#:

كود :
[FONT=Tahoma]using System.Collections;[/FONT]

vb.net:

كود :
[FONT=Tahoma]Imports System.Collections [/FONT]


لكن جاءت array List لتلقي عن كاهلك اي مشاكل بخصوص هذه العمليات ، كل ما عليك هو تعريف arrayList بالطريقة التالية :
C#:

كود :
[FONT=Tahoma]ArrayList carList = new ArrayList();[/FONT]

vb.net:

كود :
[FONT=Tahoma]Dim carList As New ArrayList() [/FONT]

والآن يمكنك اضافة سيارة :
c#:

كود :
Car temp = new Car("BMW", 1990);
carList.Add(temp);

vb.net:

كود :
Dim temp As New Car("BMW", 1990)
carList.Add(temp)

تستطيع ايضاً عمل insert في جزء معين ، لاضافة السيارة مثلاً في المكان الثالث نكتب الكود التالي :
c#:

كود :
[FONT=Tahoma] carList.Insert(temp);[/FONT]

vb.net:

كود :
[FONT=Tahoma] carList.Insert(temp)[/FONT]

في الناحية الأخرى ، تستطيع مسح كامل القائمة :

C#:

كود :
[FONT=Tahoma]carList.Clear();[/FONT]

vb.net:

كود :
[FONT=Tahoma]carList.Clear()[/FONT]

أو حذف عنصر معين بدلالة موقعه :
C#:

كود :
[FONT=Tahoma]carList.RemoveAt(4);[/FONT]

vb.net:

كود :
[FONT=Tahoma]carList.RemoveAt(4)[/FONT]


او بدلالة العنصر نفسه :

C#:

كود :
carList.Remove(temp);

vb.net:

كود :
[FONT=Tahoma]carList.Remove(temp);[/FONT]


يمكننا استخدام الخاصية Count لمعرفة العدد ، وبالتالي الدوران عليهم جميعاً بالشكل التالي مثلاً :
c#:

كود :
for (int i = 0; i < carList.Count; i++)
{
temp = (Car)carList[i];
}

vb.net:

كود :
For i As Integer = 0 To carList.Count - 1
temp = DirectCast(carList(i), Car)
Next


يمكننا استخدام بعض الخصائص الأخرى مثل sort كما تعلمنا سابقاً ، يمكننا تحويلها إلى array عادية باستخدام الدالة toarray ، الدالة Reverse ستعكس ترتيب القائمة ، الدالة indexof تستخدم للبحث بالطريقة التالية ، لنفترض لدينا السيارة temp ونرغب في البحث عنها ضمن السيارات الموجودة ، سيكون ذلك بالشكل التالي :

C#:

كود :
[FONT=Tahoma]int find=carList.IndexOf(temp, 0);[/FONT]

vb.net:

كود :
[FONT=Tahoma]Dim find As Integer = carList.IndexOf(temp, 0) [/FONT]


وهكذا تستطيع استخدام المتغير find للوصول إلى مكان العنصر والتعامل معه كما تريد ، كما يمكنك تحديد نقطة بداية البحث 0 كما حددنا او تغييرها او عدم استخدامها اصلاً ، هناك ايضاً خصائص أخرى ولكن كان هذا عرضاً سريعاً لاهم الخصائص والدوال .

نتابع الدرس القادم مع Hashtable
}}}
تم الشكر بواسطة:
#5
HashTable :

واحد من طرق تخزين البيانات data structure ، مهمته الاساسية تسهيل البحث عن البيانات المرتبطة ، إذا لم تكن قد مرت عليك هذه ال hash table من قبل فانصحك بالتعرف عليها من خلال ويكبيديا هنا :

http://en.wikipedia.org/wiki/Hash_table

في السابق كنا نقوم بتكوين ال hashtable عبارة عن Linked List يرتبط كل عنصر فيه ب Linked list اخرى ، وكنا نقوم بعمل دواله واجراءاته المختلفة ، أما الآن فيمكنك ببساطة تعريف Hashtable والبدء في وضع البيانات فيه مباشرة باستخدام الأوامر التقليدية Add,AddRange و Remove وخلافه مما تعلمناه في الدرس السابق .


الدرس القادم مع ال Queue إن شاء الله .
}}}
تم الشكر بواسطة:
#6
Queue :

الترجمة الحرفية له في الطابور ، ومع اني لا استسيغ بعض الترجمات لكن لا بأس من توضيح ان ال Queue ما هو إلا طابور فعلاً ، حيث يتم دفع البيانات إليه باستخدام Enqueue واخراجها باستخدام Dequeue، أول الداخلين هو اول الخارجين فنحن هنا نتحدث عن طابور حقيقي .

إذا كنت تبرمج برنامج لتلقي طلبات العملاء ، فمن الطبيعي ان تضعها في طابور ليتم معالجة الاسبق بالوصول اولاً ، في السيرفرات ايضاً ، وربما اشهر امثلة ال Queue هو البروسيسور ( المعالج ) حيث يتم ترتيب المهمات ليتم ادخالها إلى المعالج ، الأول وصولاً للطابور هو الأول تنفيذاً بابسط صورة ، لكن لا تنس انه في نظم المعالجات الحديثة هناك العديد من العناصر التي تتحكم في دخول البيانات مثل الاولوية اضافة لنظام ال slides حيث لا يتم تنفيذ ال task مرة واحدة ... الخ .

لا نريد ان نبتعد كثيراً ، سنفترض طابور العملاء بالشكل التالي :
c#:

كود :
[FONT=Tahoma]Queue empQueue = new Queue();
employee temp=new employee();
for (int i = 0; i < 10; i++)
{
temp.userName = Console.ReadLine();
empQueue.Enqueue(temp);
}[/FONT]


vb.net:

كود :
Dim empQueue As New Queue()
Dim temp As New employee()
For i As Integer = 0 To 9
temp.userName = Console.ReadLine()
empQueue.Enqueue(temp)
Next


لو قمنا الآن بعمل Loop لنعمل Dequeue ، ستجد ان اول الموظفين دخولاً سيكون أولهم خروجاً . طبعاً لا تنس أن بامكانك استخدام بعض الخصائص مثل Count وخلافه تلك التي شرحناها في الدرس السابق .

قبل النهاية اشير فقط إلى ان الدالة Dequeue تعيد العنصر الأول وتقوم بحذفه مباشرة من الطابور ، أما الدالة Peek فهي تعيد اول عنصر في الترتيب ولكنها تحتفظ به في الطابور كما كان .
في العصور الغابرة كان هناك الكثير والكثير حول ال Queue وكيفية تطبيقه باستخدام ال linked list ، وال circular queue والكثير مما يمكن ان تكون قد اطلعت عليه إذا كنت قد درست Data Structure .

نواصل في الدرس القادم مع ال Stack .
}}}
تم الشكر بواسطة:
#7
Stack :

مثل ال Queue فيما عدا انه يتبع تقنية LIFO - Last Input First Output ، حيث ان العنصر الآخير في الدخول هو الأول في الخروج ، يتم ادخال العناصر باستخدام Push ويتم اخراجها باستخدام pop ، ال Peek تقوم بمهمتها كما هي في عرض العنصر الأول وهو في حالتنا الآخر دخولاً دون حذفه من ال Stack .

تعريف ال Stack يتم ببساطة بالشكل التالي :

C#:


كود :
Stack jobStack = new Stack();
vb.net:


كود :
Dim jobStack As New Stack()

الاستخدامات :

يسهل تصور استخدامات من اجل ال Queue ، ذلك ان معظم تطبيقات حياتنا اليومية تعتمد على ذلك ، حيث الواصل أولاً يخدم اولاً ، لكن ال Stack بمبدئة المنافي للعدالة ربما سيكون غريباً بعض الشيء تطبيقه في حياتنا الحقيقية ، لذا فإن استخدام ال Stack يقتصر في العادة على تطبيقات الكومبيوتر .

ابسط استخدام لل Stack هو حل المعادلات في البروسيسور ، إن المعادلة :

A + B

تدخل إلى البروسيسور بالشكل التالي :

AB+

يسمى هذا الاسلوب باسم postfix، وفي البروسيسور يتم ادخالهم في stack لتنفيذهم حيث ان تنفيذهم لن يتم بترتيب الوصول ، مثال آخر في ترجمة ال Compilers ايضاً .

في المرفقات برنامج يوضح كيفية التحويل بين postfix و infix كان احد مشاريع الكلية في الفرقة الثالثة ل FUTEX Group ، يوضح البرنامج كيفية التحويل وكيفية يقوم البروسيسور بوضعهم في stack وتنفيذهم ، قم باختيار View لاستعراض سرعة عرض الخطوات ، يمكنك الحل باستخدام الارقام او الرموز ويمكنك الاختيار فيما بينهما من اعلى النافذة . هذا إذا كنت مهتماً ببعض التفاصيل .
http://vb4arb.com/vb/uploaded/18_01350216520.rar


مزيد من التفاصيل تجدها في موقع MSDN هنا :
http://msdn2.microsoft.com/en-us/library/aa289149(VS.71).aspx

كل ما سبق في هذا الدرس ينطبق تحت علم Data Structure ، يمكنك الانطلاق من هذه النقطة إذا كنت ترغب في معرفة الكثير عن هذا العالم الذي يتداخل معك كثيراً في عالمك ، سيفيدك ان تكون مطلعاً على اساسياته اضافة لعلم ال Algorithms .

ايضاً هناك ما يعرف باسمSystem.Collections.Specialized ويحتوي على فئات اخرى اكثر تخصصاً مشتقة من الفئات السابقة .


والله الموفق ...
والسلام عليكم ورحمة الله وبركاته .
}}}
تم الشكر بواسطة:



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


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