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

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

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

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

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

    אני צריך לבנות פונקציה שמקבלת enum שמוגדר כ flags, לקבלת ערכים מרובים.
    כמובן שאת ה enum הגדרתי שלכל משתנה יש ערך בחזקת 2 מקודמו,
    איך אני בודק מה מי וכמה נשלח לפונקציה?
    ולמה יש צורך בסימון על הenum ב attribute שהוא flags?

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

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

      זה טוב לך?

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

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

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

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

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

        תגובה 1 תגובה אחרונה
        1
        • 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
                                  • דף הבית
                                  • קטגוריות
                                  • פוסטים אחרונים
                                  • משתמשים
                                  • חיפוש
                                  • חוקי הפורום