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

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. C# פונקציה לטיפול ב enum המוגדר כ flags ?

C# פונקציה לטיפול ב enum המוגדר כ flags ?

מתוזמן נעוץ נעול הועבר ארכיון code613m
16 פוסטים 6 כותבים 989 צפיות 6 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • dovidD מנותק
    dovidD מנותק
    dovid
    ניהול
    כתב ב נערך לאחרונה על ידי
    #4

    הביטוי:
    משתנה לבדיקה & אפשרות קיימת, מחזיר אפס במידה והאפשרות לא במשתנה.

    var varOption = Options.A | Options.B;  //מכיל A+B
    
    if((varOption & Options.A) != 0)        //חיובי
    	Console.WriteLine("A");  
    if ((varOption & Options.B) != 0)       //חיובי
    	Console.WriteLine("B");
    
    varOption |= Options.C;                 //מוסיף את C
    var varOptionWithoutA = (varOption & ~Options.A);      //יוצר משתנה עותק אבל ללא A
    

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

    פורסם במקור בפורום CODE613 ב01/07/2016 10:56 (+03:00)

    • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
    • בכל נושא אפשר ליצור קשר dovid@tchumim.com
    תגובה 1 תגובה אחרונה
    2
    • A מנותק
      A מנותק
      avr416
      כתב ב נערך לאחרונה על ידי
      #5

      סליחה על הבורות, אפשר הסבר פשוט מהו flags?

      פורסם במקור בפורום CODE613 ב03/07/2016 23:05 (+03:00)

      תגובה 1 תגובה אחרונה
      0
      • dovidD מנותק
        dovidD מנותק
        dovid
        ניהול
        כתב ב נערך לאחרונה על ידי
        #6

        @avr416

        סליחה על הבורות, אפשר הסבר פשוט מהו flags?

        דגלים.
        כלומר לא או זה או זה, אלא כל אפשרות כן/לא.
        נגיד למתודה MessageBox.Show יש פרמטר (שישי) בשם options שמקבל טיפוס של Enum בשם MessageBoxOptions
        הוא נראה ככה:

        public enum MessageBoxOptions
        {
            ServiceNotification = 0x00200000,
            DefaultDesktopOnly = 0x00020000,
            RightAlign = 0x00080000,
            RtlReading = 0x00100000,
        }
        

        עכשיו זה אפשרויות שלא מוכרח שתבחר רק אחת מהם, כל אחת היא שיקול בפני עצמה. אז מה עושים אם רוצים גם וגם? זה הרעיון של flag. זה לדחוס במשתנה מספרי אחד כמה וכמה אפשרויות. כי הרי משתנה מספרי עשוי בזיכרון המחשב מכמה וכמה סיביות של כן ולא, הראשונה מייצגת 1, השניה 2, וכן הלאה בחזקת 2.
        ממילא אפשר להקצות לכל אפשרות סיבית. המחשב אלוף בפעולות על סיביות, מאחורי הקלעים זה מה שהוא עושה כל היום.
        במידה ורוצים לתת שתי אפשרויות לתוך משתנה אחד, אומרים למחשב "הדלק את הסיביות המתאימות לאפשרות זו, וגם את המתאימות לאפשרות זו"
        נניח אפשרות א, 1 זה נראה במחשב ככה: 00000000001 אפשרות שמינית זה נניח 128 וזה נראה ככה: 000100000000.
        אז להדליק את הסיביות של שתי האפשרויות יוצא 000100000001.
        כמובן צריך לתת לערכי הEnum כאלה מספרים שלא תהיה להם דו משמעות בסיביות.

        הדרך בה מדליקים את שתי הצדדים זה ע"י האופרטור או:
        1 | 128 = 129

        לכן במתודה MessageBox.Show אפשר להעמיס כמה אפשרויות, ככה:

        MessageBox.Show("","", MessageBoxButton.OK,
         MessageBoxImage.Asterisk,
         MessageBoxResult.No,
         MessageBoxOptions.DefaultDesktopOnly | MessageBoxOptions.RightAlign)
        

        ויעויין עוד:
        http://code.613m.org/viewtopic.php?f=1&t=762&p=4617
        http://code.613m.org/viewtopic.php?f=1&t=121#p662

        פורסם במקור בפורום CODE613 ב04/07/2016 00:21 (+03:00)

        • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
        • בכל נושא אפשר ליצור קשר dovid@tchumim.com
        תגובה 1 תגובה אחרונה
        3
        • A מנותק
          A מנותק
          avr416
          כתב ב נערך לאחרונה על ידי
          #7

          על כזאת תשובה בהירה ומפורטת, לא מספיק רק לסמן תודה..
          אז שכוייח עצום!!

          פורסם במקור בפורום CODE613 ב04/07/2016 10:04 (+03:00)

          תגובה 1 תגובה אחרונה
          3
          • Z מנותק
            Z מנותק
            zvi good
            כתב ב נערך לאחרונה על ידי
            #8

            @ארכיטקט

            זה טוב לך?

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

            לדוגמה יצרתי enum של ימים כך

            public enum Days
                    {
                        Sunday = 1,
                        Monday = 2,
                        Tuesday = 4,
                        Wednesday = 8,
                        Thursday = 16,
                        Friday = 32,
                        Saturday = 64
                    };
            

            יש לי פונקציה שלדוגמה מקבלת ימים שבהם נקבע פגישה עם ....
            לפעמים נקבע פגישה רק יום אחד באותו שבוע ולפעמים כמה ימים באותו שבוע,
            הנה הפניות לפונקציה

            dailyPlanner(Days.Monday | Days.Monday | Days.Sunday);
            dailyPlanner(Days.Sunday);
            

            וכאן יש לי שתי שאלות
            אחת האם הדרך היחידה לקבל את זה בפונקציה הוא כ enum או שאפשרי כמספר?
            ולשאלה העיקרית אני רוצה לבנות את גוף הפונקציה dailyPlanner שמקבלת את ה enum
            איך אני בודק מה התקבל בפונקציה? האם Sunday לבד או גם Monday וכו'...
            תודה על העזרה

            פורסם במקור בפורום CODE613 ב04/07/2016 23:20 (+03:00)

            תגובה 1 תגובה אחרונה
            0
            • רחמיםר מנותק
              רחמיםר מנותק
              רחמים
              מורחק
              כתב ב נערך לאחרונה על ידי
              #9

              למה לך להסתבך עם ENUM?
              במקום כך:

              dailyPlanner(Days.Monday | Days.Monday | Days.Sunday);
              dailyPlanner(Days.Sunday);
              

              תכתב כך:

              dailyPlanner(Days.Monday, Days.Monday, Days.Sunday);
              dailyPlanner(Days.Sunday);
              

              וגוף הפונקציה יראה כך:

              private static void dailyPlanner(params Days[] days)
                      {
                          // ...
                      }
              

              כך תוכל לקבל את הימים כמערך ולא תצטרך לחלץ אותם מתוך ערך בודד.

              פורסם במקור בפורום CODE613 ב05/07/2016 07:50 (+03:00)

              תגובה 1 תגובה אחרונה
              0
              • dovidD מנותק
                dovidD מנותק
                dovid
                ניהול
                כתב ב נערך לאחרונה על ידי
                #10

                אבל רחמים, זה בשביל לחסוך לו להבין אותנו? או לחסוך לך להסביר?
                גם אם הקוד שלך היה חוסך הוא לא במקומו כשהבן אדם אומר לא הבנתי איך עושים אתה אומר תמשיך לא להבין, העיקר הבעיה שלך סודרה...
                ושנית הוא לא טוב: א. הוא מאפשר לשלוח ללא אף יום ב. הרי הימים לא נבחרים ע"י המתכנת בזמן עיצוב... וע"י קלט המשתמש אתה צריך להוסיף את הימים שנבחרו - יצירת List - אז מה הועלנו עם הparams... בEnum אתה חוסך לבדוק כפילויות אבל זה לא כ"כ הפואנטה.

                zvi good תמה אני מה לא הבנת בתשובות הכה מפורטות שלנו... ומה בוער לך לקבל כמספר ולא כEnum (אכן, אתה יכול! אבל למה)...

                פורסם במקור בפורום CODE613 ב05/07/2016 10:58 (+03:00)

                • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                תגובה 1 תגובה אחרונה
                0
                • רחמיםר מנותק
                  רחמיםר מנותק
                  רחמים
                  מורחק
                  כתב ב נערך לאחרונה על ידי
                  #11

                  לדעתי הפתרון הזה יותר טוב מאשר ENUM, כי מן הסתם הוא מקבל את הימים הנבחרים מהמשתמש שבחר ימים בתוך ליסט-בוס, והכי קל זה להעביר לפוקנציה dailyPlanner את רשימת הנבחרים בליסט-בוס הנ"ל כרשימה או מערך, מאשר להמיר את כולם לערך ENUM.
                  אבל אם הוא עובד עם דטה-ביס ורוצה לשמור את הימים שנבחרו, אז בהחלט עדיף לשמור כENUM שהוא ערך בודד שמכיל הרבה ערכים מאשר לשמור רשימה בתוך המסד נתונים.

                  @דוד ל.ט.

                  א. הוא מאפשר לשלוח ללא אף יום ב. הרי הימים לא נבחרים ע"י המתכנת בזמן עיצוב... וע"י קלט המשתמש אתה צריך להוסיף את הימים שנבחרו - יצירת List - אז מה הועלנו עם הparams... בEnum אתה חוסך לבדוק כפילויות אבל זה לא כ"כ הפואנטה.

                  א. אפשר להוסיף שורה כזו:

                  private static void dailyPlanner(params Days[] days)
                          {
                              if (days == null || days.Length == 0) throw new ArgumentException("days");
                              // ...
                          }
                  

                  ב. לא הבנתי "להוסיף את הימים שנבחרו - יצירת List" ? הימים הנבחרים נמצאים במערך שנקרא days אז מה הבעיה?

                  פורסם במקור בפורום CODE613 ב05/07/2016 11:31 (+03:00)

                  תגובה 1 תגובה אחרונה
                  0
                  • dovidD מנותק
                    dovidD מנותק
                    dovid
                    ניהול
                    כתב ב נערך לאחרונה על ידי
                    #12

                    רחמים, פתח אשכול חדש.

                    פורסם במקור בפורום CODE613 ב05/07/2016 11:44 (+03:00)

                    • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                    • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                    תגובה 1 תגובה אחרונה
                    0
                    • S מנותק
                      S מנותק
                      softs
                      כתב ב נערך לאחרונה על ידי
                      #13

                      שימוש קלאסי ב Flags הוא במקרה של צורך בהעברת אוסף של הגדרות True\False שלא תלויות זו בזו לפונקציה מסוימת
                      כמו ב MessageBox לדוגמה, מה יהיה האייקון והאם ייושר לימין וכו', זה קריא, פשוט וחסכוני.
                      ל Enum שלא מוגדר כ Flags יש עוד שימושים כמו הגבלת קלט לפונקציה.

                      הגישה של למה להסתבך ממש מעצבנת אותי, מתכנת צריך לשאוף להכיר כל אבן מאבני הבנין של התכנות על בוריה, ואחר כך מתוך עמדה של ידע להחליט במה להשתמש ובמה לא.

                      פורסם במקור בפורום CODE613 ב05/07/2016 11:55 (+03:00)

                      תגובה 1 תגובה אחרונה
                      3
                      • רחמיםר מנותק
                        רחמיםר מנותק
                        רחמים
                        מורחק
                        כתב ב נערך לאחרונה על ידי
                        #14

                        @דוד ל.ט.

                        רחמים, פתח אשכול חדש.

                        עם איזה נושא?

                        פורסם במקור בפורום CODE613 ב05/07/2016 12:55 (+03:00)

                        תגובה 1 תגובה אחרונה
                        0
                        • א מנותק
                          א מנותק
                          ארכיטקט
                          כתב ב נערך לאחרונה על ידי
                          #15

                          @softs

                          הגישה של למה להסתבך ממש מעצבנת אותי, מתכנת צריך לשאוף להכיר כל אבן מאבני הבנין של התכנות על בוריה, ואחר כך מתוך עמדה של ידע להחליט במה להשתמש ובמה לא.

                          הבטחתי בלי נדר שאני לא מעלה את הנושא של דת ומדינה כדי לראות האם אני תמיד אשם בויכוחים הללו, והנה זה הגיע :lol: :lol: :lol:

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

                          פורסם במקור בפורום CODE613 ב05/07/2016 13:34 (+03:00)

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

                          תגובה 1 תגובה אחרונה
                          0
                          • dovidD מנותק
                            dovidD מנותק
                            dovid
                            ניהול
                            כתב ב נערך לאחרונה על ידי
                            #16

                            @רחמים

                            @דוד ל.ט.
                            רחמים, פתח אשכול חדש.

                            עם איזה נושא?

                            בנושא: "פונקציה שמקבלת כמה ערכי Enum, לדעתי עדיף סוג מערך מאשר קומבינציית הערכים יחד".
                            בהודעה תסביר למה.
                            זה לא קשור לנושא האשכול: איך משתמשים בEnum, הנושא זה עדיין רלוונטי וממילא עדיף לא לסטות ממנו.

                            פורסם במקור בפורום CODE613 ב05/07/2016 15:03 (+03:00)

                            • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                            • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                            תגובה 1 תגובה אחרונה
                            0
                            תגובה
                            • תגובה כנושא
                            התחברו כדי לפרסם תגובה
                            • מהישן לחדש
                            • מהחדש לישן
                            • הכי הרבה הצבעות


                            בא תתחבר לדף היומי!
                            • התחברות

                            • אין לך חשבון עדיין? הרשמה

                            • התחברו או הירשמו כדי לחפש.
                            • פוסט ראשון
                              פוסט אחרון
                            0
                            • דף הבית
                            • קטגוריות
                            • פוסטים אחרונים
                            • משתמשים
                            • חיפוש
                            • חוקי הפורום