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

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

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. אלגוריתם: סינון מערך (#C)

אלגוריתם: סינון מערך (#C)

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

    @קומפיונט אמר באלגוריתם: סינון מערך (#C):

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

    הפונקציה Max מקבלת פונקציה שלך, והשגיאה קורית שמה. למה שהם יטפלו בשגיאות בקוד שלך?

    @קומפיונט אמר באלגוריתם: סינון מערך (#C):

    שוב לא הבנתי את דבריך. אצלי בשתי הדרכים לא זורק שגיאה, ורק בקריאה לMax זה כן זורק שגיאה.

    קדימה, נתון מערך:

    var testList = new[]
    {
        new  { id = 1, version = 1},
        new  { id = 1, version = 5},
        new  { id = 2, version = 4},
        new  { id = 3, version = 3},
        new  { id = 3, version = 2},
        new  { id = 3, version = 1},
        new  { id = 1, version = 12},
        new  { id = 1, version = 155},
        null
    };
    

    אשמח שתספק לי קוד שמביא את התוצאה שביקשת, בלי טיפול בnull כלומר באופן בו max היה נכשל.

    מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

    בכל נושא אפשר ליצור קשר dovid@tchumim.com

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

      @dovid אני רואה שזה לא פשוט להתעסק אתך..
      (בכלל, אני מתחרט שנכנסתי לבוץ הזה ☺)

      @dovid אמר באלגוריתם: סינון מערך (#C):

      אשמח שתספק לי קוד שמביא את התוצאה שביקשת, בלי טיפול בnull כלומר באופן בו max היה נכשל.

      זה הקוד:

      var testList = new[]
      {
          new  { id = 1, version = 1},
          new  { id = 1, version = 5},
          new  { id = 2, version = 4},
          new  { id = 3, version = 3},
          new  { id = 3, version = 2},
          new  { id = 3, version = 1},
          new  { id = 1, version = 12},
          new  { id = 1, version = 155},
          null
      };
      
      int max;
      
      // Test 1
      try
      {
          max = testList.Where(x => x is not null).Max(x => x.id);
          Console.WriteLine("test 1 succesed! max is: " + max);
      }
      catch (Exception ex)
      {
          Console.WriteLine("test 1 failed! " + ex.Message);
      }
      
      // Test 2
      try
      {
          max = testList.Max(x => x is null ? 0 : x.id);
          Console.WriteLine("test 2 succesed! max is: " + max);
      }
      catch (Exception ex)
      {
          Console.WriteLine("test 2 failed! " + ex.Message);
      }
      
      // Test 3
      try
      {
          max = testList.Max(x => x.id);
          Console.WriteLine("test 3 succesed! max is: " + max);
      }
      catch (Exception ex)
      {
          Console.WriteLine("test 3 failed! " + ex.Message);
      }
      

      וזה הפלט:

      test 1 succesed! max is: 3
      test 2 succesed! max is: 3
      test 3 failed! Object reference not set to an instance of an object.
      

      @dovid אתה צודק בטענה שהטעות היא בקוד של הפונקציה ומיקרוסופט לא היו צריכים לטפל בשגיאות שלי, אם כי זה לא סותר את ההווה אמינא שהייתה להם אפשרות למנוע זאת מראש ולא להריץ את פונקציית הבדיקה על אובייקט שהוא null.

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

      ובקשר לקוד, אני כבר יענה לעצמי במקומך שהבעיה היא לא נמצאת ב-Max אלא בקוד שלי. אני יודע את זה. אני רק ניסיתי לתת צד ולנסות להסביר את מה @Aharon-0 אמר.

      אגב, תסתכל פה

      dovidD תגובה 1 תגובה אחרונה
      0
      • dovidD מנותק
        dovidD מנותק
        dovid ניהול
        השיב לקומפיונט ב נערך לאחרונה על ידי dovid
        #23

        @קומפיונט ביקשתי דוגמה שבה Max ייכשל אבל שיטה אחרת תעבוד בלי טיפול בNull
        אתה כן טיפלת בNull מה שעוזר גם בMax.
        אם אתה רוצה שאבין את אהרון אתה צריך למצוא מצב שMax נכשל, ושיטה אחרת מצליחה באותו האופן (מה שנקרא בלימוד "דכוותא").
        למשל בדרך של OrderByDescending ואז First, גם תקרה שגיאה אם לא סינון מוקדם של הריקים או ההתניה היפה שעשית. אז במה רע כוחו של max.

        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

        בכל נושא אפשר ליצור קשר dovid@tchumim.com

        קומפיונטק תגובה 1 תגובה אחרונה
        0
        • קומפיונטק מנותק
          קומפיונטק מנותק
          קומפיונט
          השיב לdovid ב נערך לאחרונה על ידי קומפיונט
          #24

          @dovid אמר באלגוריתם: סינון מערך (#C):

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

          @dovid אתה רוצה שאני אביא לך דוגמא שאתה בעצמך יודע שאין כזאת אפשרות בעולם. זה כמו שתגיד לי: 'אם תרצה שאבין את אהרון תן לי דוגמא שאחד ועוד אחד שווה שלוש'.

          אבל דוגמא תיאורטית מטופשת אני יכול להביא לך אם ממש תרצה בכך:
          יש לך מערך של אנשים, שאתה כבר יודע שהאיש הראשון ברשימה הוא האדם הצעיר ביותר, אם תרצה להחזיר את האיש הצעיר ביותר תוכל גם עם MinBy, וגם עם First. בעוד שMinBy יזרוק שגיאה אם אחד האברים במערך הוא null, מה שאין כן First שיחזיר את הערך הראשון אפילו אם יש הרבה nullים, וגם אם הראשון null הוא יחזיר אותו.

          אז הנה דוגמה מטופשת שלא מורידה בכי הוא זה את היעילות של MinBy, MaxBy ודומיהן. אם תרצה דוגמא מעשית אתה כבר יודע שאין כזאת דוגמא.

          אני לא יודע אם @Aharon-0 הבין את מה שהוא אמר, אני יכול לדון אותו לכף זכות שהוא חשב שהקריאה היא רק לFirst, אבל הוא שכח שלפני זה נקרא הOrderBy ואם יהיה איבר null במערך זה יפול כבר שם, אז אין שום 'בעיה' להשתמש עם MaxBy. ואדרבה הוא יותר יעיל כמו שאמרת (כי מבוזבז להשתמש בOrderBy ולמיין מערך שלם רק בשביל להביא את הערך הגבוהה ביותר).

          וחס וחלילה לומר שmax הוא 'בעייתי'.

          @dovid נראה לי שהנושא הזה כבר הגדיש את הסאה. מספיק..

          dovidD תגובה 1 תגובה אחרונה
          0
          • dovidD מנותק
            dovidD מנותק
            dovid ניהול
            השיב לקומפיונט ב נערך לאחרונה על ידי
            #25

            @קומפיונט אמר באלגוריתם: סינון מערך (#C):

            @dovid נראה לי שהנושא הזה כבר הגדיש את הסאה. מספיק..

            אני מציית.

            מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

            בכל נושא אפשר ליצור קשר dovid@tchumim.com

            תגובה 1 תגובה אחרונה
            2

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

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

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