27.11.2019

Generics - המשך \ Attribute \ LINQ


Where - מגבלות על הפרמטרים

ניתן  להגדיר מגבלות על הפרמטרים הגנרים אותם נקבלT   לא יהיה מכל סוג כלשהו אלא יהיה חייב לעמוד במגבלות שנדרוש

  דוג'

public class Program

    {

        static void Main(string[] args)

        {

            stam s = new stam();

            List<int> nums = new List<int>();

            nums.Add(8);

            nums.Add(18);

            s.show(nums);



            List<men> nums2 = new List<men>();

            nums2.Add(new men());

            s.show(nums2);



        }

    }



    public class stam



    {

        public void show<T>(List<T> items) where T:IComparable<T>

        {

            foreach (var item in items)

            {

                Console.WriteLine(item);

            }

        }



    }

     public class men

    {

        public string name { get; set; }

    }



הפונקציה הזאת תקבל רשימה אבל רק רשימה לפי התנאי  -  הגדרה היא שרק רשימות בעלי אפשרות להשוואה יוכלו לעבור לפונקציה ולכן רשימה של אובייקטים לא יכולים לעבור ובשורה המסומנת נקבל הודעת שגיאה

ניתן לגדיר משתנה גלובלי שמוגבל למחלקה ספציפית שכל משתנה יוכל להתקבל אך רק מאותה המחלקה  

שים לב - זה לא הורשה !!!








Attribute

Attribute   – תוספת שנותנים לפונקציה \ קלאס – לשנות את ההתנהגות שלה ללא נגיעה בפונקציה



Obsolete  - הודעה. במידה ויש שדה\פונקציה\מחלקה שאנחנו רוצים להוציא משימוש אבל היא עדיין נצרכת בקוד ישן כך שלא שייך למחוק אותה – נשתמש ב Obsolete   - התכונה של הפונקציה היא שהיא מיושנת וכשמישהו יקרא לפונקציה הוא יקבל אזהרה שזה פונקציה מיושנת



שים לב -  attribute נכתב בסוגריים מרובעות לפני הפונקציה\שדה.

[Obsolete]

    public static string Method1()

    {

        return "You have called Method1.";

    }



ניתן גם להשאיר הודעה שתצורף לאזהרה של המערכת

[ObsoleteAttribute("This method will soon be deprecated. Use MethodNew instead.")]



 או לבצע חסימה – בקריאה לפונקציה תתקבל שגיאת קומפילציה (כשאין ערך זה שווה ל false)

[ObsoleteAttribute("This method has been deprecated" true)]







Serializable

כשאנחנו יוצרים אובייקט ביישום מסגרת .Net צוריך לחשוב על האופן שבו הנתונים נשמרים בזיכרון. כי .Net Framework דואג לזה אבל אם אנחנו רוצים להעביר את המידע לקובץ(טקסט או XML) \ ברשת \או לתהליך אחר במחשב צריך להמיר את המידע לתבנית שניתן להעביר.

Serializable הוא  Attribute שממיר את האובייקט לרצף טקסט – או להפך מקבל רצף טקסט וממיר לאובייקט




Extension Method

כשיש לי מחלקה סגורה ואני לא רוצה לנגוע בה אבל צריך להוסיף פונקציה או במקרה שקניתי קובץ DLL שעושה סט פעולות ואני רוצה להוסיף פעולה משלי ניתן להגדיר פונקציה חיצונית שנכנסת לתוך המחלקה

בדוג' הזאת יש קובץ שמצורף לפרויקט עם מחלקה בשם Geek שלה יש פונקציה print הוספנו פונקציה וקישרנו אותה באמצעות הפקודה this Geek g_stam – עכשיו כשאנחנו יוצרים אובייקט מהמחלקה Geek יש לנו גם את הפונקציה הזאת. ברשימה היא מסומנת עם חץ מטה שמראה שזה פונקציה שהגיע ממקור חיצוני

public class GFG

    {

        public static void Main(string[] args)

        {

            Geek g1 = new Geek();

            g1.print();

            g1.MetLocali();

        }

    }



    public  static class stam

    {

        public static void MetLocali(this Geek g_stam)

        {

            Console.WriteLine("Method Name: MetLocali");

        }

    }








anonymous type


עד היום למדנו שאובייקטים מגיעים ממחלקה שמכילה שדות או מתודות אך ניתן גם ליצור אובייקט תוך כדי ריצה עם משתנים אנונימיים (זה לא אומר שכל מה שלמדנו לא נכון... לטיפוס אנונימי יש מספר מגבלות ולכן משמש עבור דברים ספציפיים)

דוג'

var user = new

{

Name = "dodo",

Age = 42

};

Console.WriteLine(user.Name + " - " + user.Age + " years old");

1.      יש להגדיר את האובייקט באמצעות המשתנה varnew

2.      יוצרים את השדות ללא צורך בהכרזה על סוג המשתנה – הקומפיילר מזהה לבד את הסוג ומבצע את ההגדרה  








LINQ

Language Integrated Query ובקיצור LINQ - שפה הצהרתית דמוית SQL לביצוע שאילתות שמייקרוסופט שילבה בתוך הדוט נט במטרה שהמתכנת יתעסק יותר במה שהוא רוצה לקבל ולא בדרך לקבלת המידע

1.      בC#  נתונים רבים נשמרים בתוך מערך \אוסף \ רשימה וחלק ניכר מזמן המפתח מוקדש לביצוע מניפולציות על מידע. ובשביל זה נכתוב פונקציה שתעבור על האוסף ותבחר רק את הערכים שעומדים בתנאים. באמצעות LINQ נוכל לבצע את זה בצורה הרבה יותר מהירה ויותר קריאה

2.      לעיתים מידע מגיע ממספר סוגים של מקורות נתונים, עובדה זו מקשה עלינו המפתחים בשל הצורך ללמוד ולהכיר "שפות" שונות וטכניקות שונות, LINQ - מספקת לנו מודל ותחביר אחידים לטיפול במידע ללא קשר למקור הנתונים ממנו הוא מגיע,



Linq מאפשרת ביצוע שאילתות חיפוש, סינון, סידור, צירוף, איחוד לקבוצות של נתונים וכו'.

ב-Linq ניתן להשתמש בשתי דרכים: הראשונה בתחביר ייעודי שהפך להיות חלק מתחביר השפה והשניה היא אוסף מתודות ייעודיות העושות שימוש בביטויי למבדה תוך שימוש ב- Func<T> delegate ומסתירות את התחביר הבסיסי ובכך להפחית את כמות הקוד הנדרש למספר שורות בודדות





מבנה תחבירי בסיסי

         int[] myArr = { 10, 20, 8, 2 };



            var result = from num in myArr

                         where (num % 2) == 0

                         select num;



1.     var result  - הגדרת משתנה אנונימי שיקבל את התוצאה של השאילתה

2.       from - שאילתה חייבת להתחיל במילה השמורה from.

3.       num - משתנה שמיצג את האלמנטים שמתקבלים מהמקור – סוג המשתנה מוגדר אוטומטית לפי הערכים שהתקבלו

4.       in myArr  - מקור המידע עליו מתבצעת השאילתה מוגדר באמצעות המילה השמורה in

5.       Where - (אופצינאלי) משמש להגדרת התנאים לשאילתה

6.       select מגדיר את הטיפוס של האלמנטים שיוצרו כתוצאת השאילתה







שאילתות Linq ניתן להריץ גם על אוסף אובייקטים

לדוג'

יצרנו רשימה של אובייקטים ואז עושים שאילתה שמשתנה  Healthy יקבל רק אובייקטים שעומדים בתנאי








namespace testlinq

{

    class Program

    {

        static void Main(string[] args)

        {

            List<IceCream> IceCreams = new List<IceCream>

            {

                new IceCream {Description="vanilla" , calories=200, Vitamins=30 ,weight=99},

                new IceCream {Description="banana" , calories=50, Vitamins=10 ,weight=50},

                new IceCream {Description="coffe" , calories=30, Vitamins=70 ,weight=90},

                new IceCream {Description="chocolad" , calories=105, Vitamins=80 ,weight=500},

            };



   var Healthy = from c in IceCreams

                           where ((c.calories < 80) && (c.Vitamins > 30))

                           select c2;

            foreach (var item in Healthy)

            {

                Console.WriteLine(item.Description);

            }

        }

    }



    public class IceCream

    {

        public string Description { get; set; }

        public int calories { get; set; }

        public int Vitamins { get; set; }

        public int weight { get; set; }

    }

}











שימוש ב Lambda

Lambda – היא פונקציה אנונימית שמקבלת פרמטרים מבצעת פעולה אריתמטית ומחזירה תוצאה

ניתן לראות בדוג' הבאה שבאמצעות שורה אחת הפעלנו פונקציה שתחזיר רק את מה שעומד בתנאי וגם תמיין את הרשימה לפי סדר עולה



int[] nums = new int[] {1,4,2,6,3,8,3,1,2,5,9};

var result = nums.Where(n => n > 5).OrderBy (n => n);



<=   -  לך אל  nums.Where(n => n > 5)  - n  בפונקציה מקבל את מה ששלחנו ושולח לבדיקה

ו result יקבל בחזרה רק את מה שSRUE





דוג' נוספת של סינון רשימת אובייקטים



static void Main(string[] args)

        {

            List<IceCream> IceCreams = new List<IceCream>

            {

                new IceCream {Description="vanilla" , calories=200, Vitamins=30 ,weight=99},

                new IceCream {Description="banana" , calories=50, Vitamins=10 ,weight=50},

                new IceCream {Description="coffe" , calories=30, Vitamins=70 ,weight=90},

                new IceCream {Description="chocolad" , calories=105, Vitamins=80 ,weight=500},

            };





            var Healthy = IceCreams.Where(c => c.calories > 70).Select(c => c);



            foreach (var item in Healthy)

            {

                Console.WriteLine($"the iceCreams {item.Description} weight is {item.weight}");

            }

        }

אין תגובות:

הוסף רשומת תגובה

MVC

Web api Front end (צד משתמש) שולח http request     כל אתר מכל מכשיר יכול להתחבר ולקבל נתונים (אין אפליקציה) ולא משנה באיזו שפה ה...