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

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

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

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

מתוזמן נעוץ נעול הועבר תכנות
25 פוסטים 4 כותבים 778 צפיות 3 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • yossizY yossiz

    @dovid איכפת לך להסביר למה לדעתך ה-max אמור להיות יותר יעיל?

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

    @yossiz כי בOrderBy במקום להחזיר את הקיצון התורן, אפשר ליישם את זה עם אלגוריתם מיון טוב יותר כל שהוא של בועות או החלפה וכדומה, וזה מיותר.

    yossizY תגובה 1 תגובה אחרונה
    2
    • קומפיונטק קומפיונט

      @dovid זה פשוט מדהים...

      אני בזבזתי על זה פונקצייה שלמה:

      public static class DistinctByVersionExtensions
          {
              public static IEnumerable<Lazy<TSource, TSourceMetadata>> DistinctByVersion<TSource, TSourceMetadata>(this IEnumerable<Lazy<TSource, TSourceMetadata>> source, Func<TSourceMetadata, string> idSelector, Func<TSourceMetadata, double> versionSelector)
              {
                  foreach (Lazy<TSource, TSourceMetadata> item in source)
                  {
                      string id = idSelector(item.Metadata);
      
                      IEnumerable<Lazy<TSource, TSourceMetadata>> same_ids = source.Where(v => idSelector(v.Metadata) == id);
      
                      if (same_ids.Any())
                      {
                          double ver = versionSelector(item.Metadata);
                          double max_ver = same_ids.Max(v => versionSelector(v.Metadata));
      
                          if (ver == max_ver)
                              yield return item;
                      }
                      else
                      {
                          yield return item;
                      }
                  }
              }
          }
      

      ולא חשבתי שזה כל כך פשוט..

      אגב, יותר נחמד זה ככה:

      .Select(x => x.OrderBy(y => y.version).Last());
      

      במקום:

      .Select(x => x.OrderByDescending(y => y.version).First());
      

      ומגרסת 6.0 של NET. אפשר גם ככה:

      .Select(x => x.MaxBy(y => y.version));
      
      dovidD מנותק
      dovidD מנותק
      dovid
      ניהול
      כתב ב נערך לאחרונה על ידי dovid
      #7

      @קומפיונט אני מתפעל (למרות שלא ירדתי לעומקה) של הפונקציה הגנרית שעשית.
      אבל בד"כ זה מאמץ מיותר להשקיע על גנריות בכאלה דברים, תעשה פונקציה ממוקדת לצורך שלך עם לולאה (שזה יהיה מהר בהרבה מהLINQ למקרה ואתה משתתף בתחרות ביצועים...), ורק כשתצטרך נסה להפוך אותה לגנרית.
      (כמובן שפונקציה מותאמת וספציפית תהיה בד"כ קלה יותר לכתיבה וגם כתופעת לוואי של פשטותה יותר מהירה גם למחשב).
      אני חושב כיום שחלק מהזמן השרוף של פיתוח של מפתחים אידאליסטים הולך על גנריות כזו של "פונקציה שעושה כל מה שצריך לכל דבר". כיון שהייתי בדיוק כזה, אני היום מזהה כאלו סכנות.
      חיפשתי בגוגל על זה ומצאתי כאלה שכותבים ממש כדברי אבל לא מצאתי מאמרים של ממש
      https://softwareengineering.stackexchange.com/questions/361605/should-the-solution-be-as-generic-as-possible-or-as-specific-as-possible
      עריכה: מצאתי מאמר Just don't write generic code

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

      קומפיונטק תגובה 1 תגובה אחרונה
      6
      • dovidD dovid

        @yossiz כי בOrderBy במקום להחזיר את הקיצון התורן, אפשר ליישם את זה עם אלגוריתם מיון טוב יותר כל שהוא של בועות או החלפה וכדומה, וזה מיותר.

        yossizY מנותק
        yossizY מנותק
        yossiz
        כתב ב נערך לאחרונה על ידי yossiz
        #8

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

        כמובן, עדיין max מומלץ על פני OrderBy + First הן מפאת קריאות וקיצור, והן משום שכך זה יקבל אוטומטי כל מיטוב עתידי

        📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

        תגובה 1 תגובה אחרונה
        7
        • dovidD dovid

          @קומפיונט אני מתפעל (למרות שלא ירדתי לעומקה) של הפונקציה הגנרית שעשית.
          אבל בד"כ זה מאמץ מיותר להשקיע על גנריות בכאלה דברים, תעשה פונקציה ממוקדת לצורך שלך עם לולאה (שזה יהיה מהר בהרבה מהLINQ למקרה ואתה משתתף בתחרות ביצועים...), ורק כשתצטרך נסה להפוך אותה לגנרית.
          (כמובן שפונקציה מותאמת וספציפית תהיה בד"כ קלה יותר לכתיבה וגם כתופעת לוואי של פשטותה יותר מהירה גם למחשב).
          אני חושב כיום שחלק מהזמן השרוף של פיתוח של מפתחים אידאליסטים הולך על גנריות כזו של "פונקציה שעושה כל מה שצריך לכל דבר". כיון שהייתי בדיוק כזה, אני היום מזהה כאלו סכנות.
          חיפשתי בגוגל על זה ומצאתי כאלה שכותבים ממש כדברי אבל לא מצאתי מאמרים של ממש
          https://softwareengineering.stackexchange.com/questions/361605/should-the-solution-be-as-generic-as-possible-or-as-specific-as-possible
          עריכה: מצאתי מאמר Just don't write generic code

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

          קומפיונטק מנותק
          קומפיונטק מנותק
          קומפיונט
          כתב ב נערך לאחרונה על ידי
          #9
          פוסט זה נמחק!
          dovidD תגובה 1 תגובה אחרונה
          0
          • קומפיונטק קומפיונט

            פוסט זה נמחק!

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

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

            אצלי זה נצרך בגלל MEF.

            לא יודע מה זה MEF, אנחנו אנשים פשוטים פה, תשתדל להתאים ל"עממי".

            קומפיונטק תגובה 1 תגובה אחרונה
            2
            • dovidD dovid

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

              אצלי זה נצרך בגלל MEF.

              לא יודע מה זה MEF, אנחנו אנשים פשוטים פה, תשתדל להתאים ל"עממי".

              קומפיונטק מנותק
              קומפיונטק מנותק
              קומפיונט
              כתב ב נערך לאחרונה על ידי קומפיונט
              #11

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

              לא יודע מה זה MEF, אנחנו אנשים פשוטים פה, תשתדל להתאים ל"עממי".

              אהה, חשבתי שיש פה תותחים מהשורה הראשונה, אז ניסיתי קצת להרשים.

              Aharon 0A תגובה 1 תגובה אחרונה
              0
              • קומפיונטק קומפיונט

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

                לא יודע מה זה MEF, אנחנו אנשים פשוטים פה, תשתדל להתאים ל"עממי".

                אהה, חשבתי שיש פה תותחים מהשורה הראשונה, אז ניסיתי קצת להרשים.

                Aharon 0A מנותק
                Aharon 0A מנותק
                Aharon 0
                כתב ב נערך לאחרונה על ידי
                #12

                @קומפיונט לא כדאי להשתמש ב max, מספיק שערך אחד null וזה מחסיר תוצאה שגויה

                קומפיונטק dovidD 2 תגובות תגובה אחרונה
                0
                • Aharon 0A Aharon 0

                  @קומפיונט לא כדאי להשתמש ב max, מספיק שערך אחד null וזה מחסיר תוצאה שגויה

                  קומפיונטק מנותק
                  קומפיונטק מנותק
                  קומפיונט
                  כתב ב נערך לאחרונה על ידי קומפיונט
                  #13

                  יש דרך יותר נחמדה לקוד דלעיל:

                  var distinct = testList.GroupBy(l => l.id).Select(x => x.MaxBy(y => y.version));
                  

                  אפשר לכתוב אותו גם ככה:

                  var distinct = from item in testList
                                 group item by item.id into id_grp
                                 select id_grp.MaxBy(x => x.version);
                  

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

                  @קומפיונט לא כדאי להשתמש ב max, מספיק שערך אחד null וזה מחסיר תוצאה שגויה

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

                  לדוגמא:

                  list.Max(e => e is null ? 0 : e.value)
                  

                  או:

                  list.Where(e => e is not null).Max(e => e.value)
                  
                  dovidD תגובה 1 תגובה אחרונה
                  0
                  • Aharon 0A Aharon 0

                    @קומפיונט לא כדאי להשתמש ב max, מספיק שערך אחד null וזה מחסיר תוצאה שגויה

                    dovidD מנותק
                    dovidD מנותק
                    dovid
                    ניהול
                    כתב ב נערך לאחרונה על ידי dovid
                    #14
                    פוסט זה נמחק!
                    תגובה 1 תגובה אחרונה
                    0
                    • קומפיונטק קומפיונט

                      יש דרך יותר נחמדה לקוד דלעיל:

                      var distinct = testList.GroupBy(l => l.id).Select(x => x.MaxBy(y => y.version));
                      

                      אפשר לכתוב אותו גם ככה:

                      var distinct = from item in testList
                                     group item by item.id into id_grp
                                     select id_grp.MaxBy(x => x.version);
                      

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

                      @קומפיונט לא כדאי להשתמש ב max, מספיק שערך אחד null וזה מחסיר תוצאה שגויה

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

                      לדוגמא:

                      list.Max(e => e is null ? 0 : e.value)
                      

                      או:

                      list.Where(e => e is not null).Max(e => e.value)
                      
                      dovidD מנותק
                      dovidD מנותק
                      dovid
                      ניהול
                      כתב ב נערך לאחרונה על ידי
                      #15

                      @קומפיונט מיהרת לתת מענה לבעיה של @Aharon-0
                      א. אשמח אם תמצא מקרה בו יש בעיה
                      ב. הכתיב במענה שלך הוא של VB.

                      קומפיונטק תגובה 1 תגובה אחרונה
                      0
                      • dovidD dovid

                        @קומפיונט מיהרת לתת מענה לבעיה של @Aharon-0
                        א. אשמח אם תמצא מקרה בו יש בעיה
                        ב. הכתיב במענה שלך הוא של VB.

                        קומפיונטק מנותק
                        קומפיונטק מנותק
                        קומפיונט
                        כתב ב נערך לאחרונה על ידי קומפיונט
                        #16

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

                        @קומפיונט מיהרת לתת מענה לבעיה של @Aharon-0
                        א. אשמח אם תמצא מקרה בו יש בעיה
                        ב. הכתיב במענה שלך הוא של VB.

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

                        int max = pople.Max(p => p.Age);
                        

                        ותקבל את הגיל של האיש המבוגר ביותר.
                        אבל מה יקרה אחד האנשים ברשימה הוא null? התשובה היא שייזרק exception! כי הוא לא יכול לגשת לגיל של אובייקט null.

                        אכן, (והבנתי לאיפה אתה חותר...) במערך של טיפוסיים נומריים לעולם לא תיזרק שגיאה כי int הוא מסוג struct שהוא ValueType ולעולם הוא לא יכול להיות null, הבעיה תהיה במערך שמחזיק classים (ReferenceType), במצב שתרצה לשלוף ערך מקסימאלי מאחד המאפיינים של האובייקט.

                        ב. אני לא נוגע בVB ואני לא יודע למה אתה אומר שזה רק בVB, אצלי זה רץ מצוין ב#C. יתכן בהחלט שלא הבנתי למה התכוונת.

                        dovidD 2 תגובות תגובה אחרונה
                        0
                        • קומפיונטק קומפיונט

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

                          @קומפיונט מיהרת לתת מענה לבעיה של @Aharon-0
                          א. אשמח אם תמצא מקרה בו יש בעיה
                          ב. הכתיב במענה שלך הוא של VB.

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

                          int max = pople.Max(p => p.Age);
                          

                          ותקבל את הגיל של האיש המבוגר ביותר.
                          אבל מה יקרה אחד האנשים ברשימה הוא null? התשובה היא שייזרק exception! כי הוא לא יכול לגשת לגיל של אובייקט null.

                          אכן, (והבנתי לאיפה אתה חותר...) במערך של טיפוסיים נומריים לעולם לא תיזרק שגיאה כי int הוא מסוג struct שהוא ValueType ולעולם הוא לא יכול להיות null, הבעיה תהיה במערך שמחזיק classים (ReferenceType), במצב שתרצה לשלוף ערך מקסימאלי מאחד המאפיינים של האובייקט.

                          ב. אני לא נוגע בVB ואני לא יודע למה אתה אומר שזה רק בVB, אצלי זה רץ מצוין ב#C. יתכן בהחלט שלא הבנתי למה התכוונת.

                          dovidD מנותק
                          dovidD מנותק
                          dovid
                          ניהול
                          כתב ב נערך לאחרונה על ידי dovid
                          #17

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

                          אבל מה יקרה אחד האנשים ברשימה הוא null? התשובה היא שייזרק exception! כי הוא לא יכול לגשת לגיל של אובייקט null.

                          ומה זה קשור לMax?
                          ויש דרך אחרת בעולם לשיטת ה"בעיה" שלא תהיה שגיאה?
                          כל הדרכים שהוצגו לעיל יעשו שגיאה במקרה שאמרת, וגם זה די נדיר שיש אוסף שאחד מאיבריו הוא ריק.
                          ואגב בשביל בעיה זו יש ? כלומר לכתוב p?.Age.
                          אני הבנתי ש@Aharon-0 מתכוון לMax על ערך int? שיש בו null אבל גם שם אני לא מוצא את הבעיה בבדיקה שלי וגם זה משונה לקבוע בגלל זה שMax היא לא דרך טובה. על דרך מכונית היא כלי רכב גרוע כי הוא לא צולח נהרות.

                          קומפיונטק 2 תגובות תגובה אחרונה
                          4
                          • קומפיונטק קומפיונט

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

                            @קומפיונט מיהרת לתת מענה לבעיה של @Aharon-0
                            א. אשמח אם תמצא מקרה בו יש בעיה
                            ב. הכתיב במענה שלך הוא של VB.

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

                            int max = pople.Max(p => p.Age);
                            

                            ותקבל את הגיל של האיש המבוגר ביותר.
                            אבל מה יקרה אחד האנשים ברשימה הוא null? התשובה היא שייזרק exception! כי הוא לא יכול לגשת לגיל של אובייקט null.

                            אכן, (והבנתי לאיפה אתה חותר...) במערך של טיפוסיים נומריים לעולם לא תיזרק שגיאה כי int הוא מסוג struct שהוא ValueType ולעולם הוא לא יכול להיות null, הבעיה תהיה במערך שמחזיק classים (ReferenceType), במצב שתרצה לשלוף ערך מקסימאלי מאחד המאפיינים של האובייקט.

                            ב. אני לא נוגע בVB ואני לא יודע למה אתה אומר שזה רק בVB, אצלי זה רץ מצוין ב#C. יתכן בהחלט שלא הבנתי למה התכוונת.

                            dovidD מנותק
                            dovidD מנותק
                            dovid
                            ניהול
                            כתב ב נערך לאחרונה על ידי
                            #18

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

                            ב. אני לא נוגע בVB ואני לא יודע למה אתה אומר שזה רק בVB, אצלי זה רץ מצוין ב#C. יתכן בהחלט שלא הבנתי למה התכוונת.

                            אני אכן לא כותב בC# 7-9 (הnot עובד רק ב9)
                            אז טעיתי בזה.

                            תגובה 1 תגובה אחרונה
                            0
                            • dovidD dovid

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

                              אבל מה יקרה אחד האנשים ברשימה הוא null? התשובה היא שייזרק exception! כי הוא לא יכול לגשת לגיל של אובייקט null.

                              ומה זה קשור לMax?
                              ויש דרך אחרת בעולם לשיטת ה"בעיה" שלא תהיה שגיאה?
                              כל הדרכים שהוצגו לעיל יעשו שגיאה במקרה שאמרת, וגם זה די נדיר שיש אוסף שאחד מאיבריו הוא ריק.
                              ואגב בשביל בעיה זו יש ? כלומר לכתוב p?.Age.
                              אני הבנתי ש@Aharon-0 מתכוון לMax על ערך int? שיש בו null אבל גם שם אני לא מוצא את הבעיה בבדיקה שלי וגם זה משונה לקבוע בגלל זה שMax היא לא דרך טובה. על דרך מכונית היא כלי רכב גרוע כי הוא לא צולח נהרות.

                              קומפיונטק מנותק
                              קומפיונטק מנותק
                              קומפיונט
                              כתב ב נערך לאחרונה על ידי קומפיונט
                              #19

                              סורי, היתה לי טעות קטנה.
                              @dovid אתה צודק לגמרי.
                              @Aharon-0 אולי תסביר את דברך.

                              תגובה 1 תגובה אחרונה
                              0
                              • dovidD dovid

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

                                אבל מה יקרה אחד האנשים ברשימה הוא null? התשובה היא שייזרק exception! כי הוא לא יכול לגשת לגיל של אובייקט null.

                                ומה זה קשור לMax?
                                ויש דרך אחרת בעולם לשיטת ה"בעיה" שלא תהיה שגיאה?
                                כל הדרכים שהוצגו לעיל יעשו שגיאה במקרה שאמרת, וגם זה די נדיר שיש אוסף שאחד מאיבריו הוא ריק.
                                ואגב בשביל בעיה זו יש ? כלומר לכתוב p?.Age.
                                אני הבנתי ש@Aharon-0 מתכוון לMax על ערך int? שיש בו null אבל גם שם אני לא מוצא את הבעיה בבדיקה שלי וגם זה משונה לקבוע בגלל זה שMax היא לא דרך טובה. על דרך מכונית היא כלי רכב גרוע כי הוא לא צולח נהרות.

                                קומפיונטק מנותק
                                קומפיונטק מנותק
                                קומפיונט
                                כתב ב נערך לאחרונה על ידי
                                #20

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

                                ויש דרך אחרת בעולם לשיטת ה"בעיה" שלא תהיה שגיאה?

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

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

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

                                dovidD תגובה 1 תגובה אחרונה
                                0
                                • קומפיונטק קומפיונט

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

                                  ויש דרך אחרת בעולם לשיטת ה"בעיה" שלא תהיה שגיאה?

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

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

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

                                  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 היה נכשל.

                                  תגובה 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
                                    • קומפיונטק קומפיונט

                                      @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 מנותק
                                      dovidD מנותק
                                      dovid
                                      ניהול
                                      כתב ב נערך לאחרונה על ידי dovid
                                      #23

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

                                      קומפיונטק תגובה 1 תגובה אחרונה
                                      0
                                      • dovidD dovid

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

                                        קומפיונטק מנותק
                                        קומפיונטק מנותק
                                        קומפיונט
                                        כתב ב נערך לאחרונה על ידי קומפיונט
                                        #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
                                        • קומפיונטק קומפיונט

                                          @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 מנותק
                                          dovidD מנותק
                                          dovid
                                          ניהול
                                          כתב ב נערך לאחרונה על ידי
                                          #25

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

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

                                          אני מציית.

                                          תגובה 1 תגובה אחרונה
                                          2
                                          תגובה
                                          • תגובה כנושא
                                          התחברו כדי לפרסם תגובה
                                          • מהישן לחדש
                                          • מהחדש לישן
                                          • הכי הרבה הצבעות


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

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

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