لما كنا بنحب نشتغل عل عدد معين من العناصر
كنا بنعملها فى اراى وكان عيبها حاجه
ان الحجم بتاعها ثابت مش بيتغير ومش ينفع استخدمها قبل ما اعرف الحجم
الحل كان استخدم list اللى موجوده فى النيم سيبس system.Collections
النيم سيبس ده بيتعامل مع انواع كتيره للداتا ستركشر
زى الستاك والكيو وarraylist -hashtable-bitarray-bitvector
كلهم تقريبا مشتركين فى ميثودس مشتركه ونفس الانتفريس ienumerable-ienumerator-ilist-icomparer
---------------------
مثلا الاراى لست
هيا هيا الاراى بس الفرق ان الحجم مش محدد
فكره اننا مش بنحدد الحجم اننا بنستخدم count-capacity
الكونت هو العدد الفعلى للعناصر جوا الاراى لست
الكابستى هو الحجم الافتراضى لعدد العناصر
يعنى اول ما اعمل اراى لست بيحجز مكان فى الميمورى اقعد انا اضيف عناصر
الكونت يزيد لو الكونت بقى اد الكابستى بيضاعف المساحه
فيه ميثودس كتيره مشتركه بين الكلاسات ديه
addبضيف عنصر
بضيف اراى من العناصرaddrange
remove يمسح عنصر وبكتب اسم العنصر
removeat بمسح عنصر بس بكتب الاندكس بتاعه
removerange بمسح مجموعه من العناصر
clear بمسح كل العناصر
insert بضيف عنصر بس فى مكان معين
امثله
ArrayList group = new ArrayList();
group.Add(1);
int[] group2={2,3,4};
group.AddRange(group2);
group.Remove(2);
Console.WriteLine(group.Count);
خدتوا بالكو من حاجه انى مش عرفت ان العناصر لازم تكون انت
عشان فى collections
بتتعامل مع اوبجكت
يعنى ممكن اضيف اى عنصر انت سترنج دبل اى حاجه
طب افرض انى عاوز اتعامل مع العناصر عل انه انت عشان اجمعه
فى الحاله ديه هحول من اوبجكت لانت او بمصطلح تانى هعمل unboxing
مثلا عاوز اجيب مجموع العناصر
ArrayList group = new ArrayList();
group.Add(1);
group.Add('a');
group.Add(2);
group.Add(3);
int sum = 0;
for (int c = 0; c < group.Count; c++)
{
sum += (int)group[c];
}
Console.WriteLine(sum);
لما اجى انفذ الكود علطول هيدى ايكسبشن
عشان تانى عنصر من نوع char ومش ينفع احوله انت
ArrayList group = new ArrayList();
group.Add(1);
group.Add(2);
group.Add(3);
int sum = 0;
for (int c = 0; c < group.Count; c++)
{
sum += (int)group[c];
}
Console.WriteLine(sum);
وفرضا انى حطيت كل العناصر انت
الكود هيتنفذ بس برضك هيبقى فيه مشكله ان الاوبجكت بتخزن فى heap انما المتغيرات بتتخزن فى الستاك فالاوبجكت بيخد مساحه كبيره
الكلام ده كان فى سى شارب 1 فى سى شارب 2
عملو حاجه اسمها Generic
قالك انى لما بجى اعمل ميثود بتخد بارميتر بحدده نوعه
تمام
static void method(int para)
{ }
قالك لا احنا مش نحدد نوعه ساعه كتابه الكود نخليه يتحدد ساعه تنفيذ البرنماج
يعنى انا ممكن اعمل ميثود بتجمع الارقام
بالطريقه القديمه لازم اعمل ميثود للانت وميثود الدبل وميثود للسينجل كل نوع بميثوده
بالطريقه الجديده ميثود واحده لكل الانواع
static void method<t>(t x)
{
Console.WriteLine(x);
}
<t> --> يعنى الميثود ديه جينريك
t--> اختصار type يعنى مش محدد نوعه دلوقتى
لوكتبنا فى الmain
method<int>(;
method<string>("Generic");
method<char>('a');
هتلاقوها بتتنفذ مع كل الانواع ومفيش اى مشكله
______________________
ولو تفتكروا هتلاقو فوق فى ملف الكود نيم سيبس
using System.Collections.Generic;
كل كلاس فى System.Collections ليها نسخه منها فى System.Collections.Generic
ماعدا linkedlist مش موجوده غير فى الجينريك بس
معنى كده لو عوزت اعمل لست من السترنج
List<string> l = new List<string>();
l.Add("string1");
l.Add("string2");
Console.WriteLine(l[0]);
هنا بقى مش محتاج اعمل unbox لان النوع متحدد
--------------------------------------------------------------------------
ال data structure يعنى مجموعه من العناصر بحدد طريقه معينه عشان اوصل لكل عنصر فيها
ممكن يكون بالاندكس زى الاراى لست وممكن يكون بالتتابع زى الستاك والكيو
الستاك والكيو موجودين فى نيم سيبس فرعىusing System.Collections.Specialized;
بيتعرفو كده
Queue q1 = new Queue();
stack s1=new stack();
والنسخه الجيرنك منهم
Stack<int> s2 = new Stack<int>();
Queue<int> q2 = new Queue<int>();
لو عوزت اضيف عنصر
s1.Push(30);
وفى الكيو
q1.Enqueue(89);
ولو عوزت اشيل عنصر
s1.Pop();
وفى الكيو
q1.Dequeue();
وفى عندى ميثود مفيده موجوده فى الاتنين
peek ديه بتجيب العنصر اللى المفروض يتشال بس مش بتشليه
فايدتها نعرف هو لسه فيه اى عنصر متبقى
بالبنسبه بقى للتاسك بتاع الاو اس
فاحنا هنستخدم جينريك ستاك والتايب بتاعه هيكون directoryinfo
Stack<DirectoryInfo> s = new Stack<DirectoryInfo>();
s.Push(new DirectoryInfo(@"c:\"));
Console.WriteLine(s.Pop().Name);
بسسسسسسسسسسسسسسسس كده
انى كوسشين