منتديات نور الهدى

هل تريد التفاعل مع هذه المساهمة؟ كل ما عليك هو إنشاء حساب جديد ببضع خطوات أو تسجيل الدخول للمتابعة.

2 مشترك

    stack+generics

    cs_senior
    cs_senior
    مشرف منتدى السى شارب
    مشرف منتدى السى شارب


    ذكر
    عدد الرسائل : 408
    نقاط : 80
    تاريخ التسجيل : 28/04/2008

    stack+generics Empty stack+generics

    مُساهمة من طرف cs_senior الأحد 1 مارس 2009 - 15:23


    لما كنا بنحب نشتغل عل عدد معين من العناصر
    كنا بنعملها فى اراى وكان عيبها حاجه
    ان الحجم بتاعها ثابت مش بيتغير ومش ينفع استخدمها قبل ما اعرف الحجم
    الحل كان استخدم 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>(Cool;
    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);
    بسسسسسسسسسسسسسسسس كده
    Question انى كوسشين
    avatar
    E.D
    عضو فعال
    عضو فعال


    انثى
    عدد الرسائل : 292
    العمر : 35
    Location : Mansoura
    نقاط : 99
    تاريخ التسجيل : 04/12/2007

    stack+generics Empty رد: stack+generics

    مُساهمة من طرف E.D الأحد 1 مارس 2009 - 18:31

    السلام عليكم..
    الشرح حلو اوي يا بشمهندس..ومفهوم جدا..

    بس يعني ايه الحتة دي:


    cs_senior كتب:

    لوكتبنا فى الmain
    method(Cool;
    method("Generic");
    method('a');
    هتلاقوها بتتنفذ مع كل الانواع ومفيش اى مشكله
    cs_senior
    cs_senior
    مشرف منتدى السى شارب
    مشرف منتدى السى شارب


    ذكر
    عدد الرسائل : 408
    نقاط : 80
    تاريخ التسجيل : 28/04/2008

    stack+generics Empty رد: stack+generics

    مُساهمة من طرف cs_senior الأحد 1 مارس 2009 - 19:06


    السلام عليكم..
    الشرح حلو اوي يا بشمهندس..ومفهوم جدا..

    بس يعني ايه الحتة دي:


    <BLOCKQUOTE>cs_senior كتب:

    لوكتبنا فى الmain
    method(Cool;
    method("Generic");
    method('a');
    هتلاقوها بتتنفذ مع كل الانواع ومفيش اى مشكله


    </BLOCKQUOTE>


    اقصد يعنى ننده عل الميثود الجينريك اللى عملنها
    بتلات انواع مختلفه من البراميتر
    method(1);
    method('a');
    method("string");
    method(122L);

      الوقت/التاريخ الآن هو الجمعة 15 نوفمبر 2024 - 4:29