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

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

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

ייעול של פונקציות החיפוש

מתוזמן נעוץ נעול הועבר ארכיון code613m
19 פוסטים 5 כותבים 981 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • S מנותק
    S מנותק
    softs
    כתב ב נערך לאחרונה על ידי
    #10

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

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

    לסינון רשימות אפשר לעשות סינון חוזר של אותה רשימה משהו כזה:

    static void Main(string[] args)
    {
        List<Donor> dnrSource = new List<Donor>();
    
        dnrSource.Add(new Donor { FirstName = "John", LastName = "Doe", Address = "31 Peachtree st."});
        dnrSource.Add(new Donor { FirstName = "Jane", LastName = "Doe", Address = "31 Peachtree st." });
        dnrSource.Add(new Donor { FirstName = "Jane", LastName = "Doe" });
    
        List<Donor> dnrFiltered = new List<Donor>(dnrSource.ToArray());
        
        if (!string.IsNullOrEmpty(FirstNameSearch.Text))
        {
            dnrFiltered = new List<Donor>(SearchString(dnrFiltered, "FirstName", FirstNameSearch.Text));
        }
    
        if (!string.IsNullOrEmpty(LastNamesearch.Text))
        {
            dnrFiltered = new List<Donor>(SearchString(dnrFiltered, "LastName", LastNamesearch.Text));
        }
    
        if (!string.IsNullOrEmpty(Addresssearch.Text))
        {
            dnrFiltered = new List<Donor>(SearchString(dnrFiltered, "Address", Addresssearch.Text));
        }
    
    }
    

    פורסם במקור בפורום CODE613 ב09/08/2015 20:17 (+03:00)

    תגובה 1 תגובה אחרונה
    4
    • A מנותק
      A מנותק
      avr416
      כתב ב נערך לאחרונה על ידי
      #11

      @softs

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

      בדיוק לכן שאלתי, כי זה היה נראה לי מוזר.. ארוך ומיותר..

      יישבתי הרבה כדי ללמוד ולהבין את הקוד שכתבת..
      לבסוף נפל לי האסימון למה התכוונתם (אתה וHSF)(בסוף הוא נופל :lol: :lol: )
      בעצם אתם מריצים חיפוש של פרמטר אחד (לדוג' שם) ואז על הרשימה שהתקבלה אתם מריצים את החיפוש השני (לדוג' של הכתובת) ועל הרשימה המצומצמת שמתקבלת אתם מריצים את השלישי וכו'.
      כך גם אתה פותר את הבעיה שהסתבכתי איתה לכתוב את כל הוריאציות של הצירופים האפשריים, אלא אתה עושה IF כמספר התיבות טקסט, ואם המשתמש הזין טקסט אתה מריץ חיפוש על הרשימה שהתקבלה מהחיפוש הקודם.
      כ"כ פשוט!! איך לא חשבתי על זה :shock: ישבתי הרבה זמן לכתוב את הקוד הזה (שהוא הרבה יותר ארוך ממה שהבאתי כאן.. מה שעשיתי כאן זה היה רק בשביל חיפוש של פרמטר אחד..)
      תודה רבה רבה שהארתם את עיני!!!

      פורסם במקור בפורום CODE613 ב09/08/2015 22:43 (+03:00)

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

        @softs

        (אקסס - יוצא מן הכלל)

        למה?

        פורסם במקור בפורום CODE613 ב09/08/2015 22:58 (+03:00)

        אין טסט כמו פרודקשן.

        המייל שלי urivpn@gmail.com

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

          כי באקסס לפעמים אין ברירה
          מספיק לראות שאילתה עם 5 join בשביל לאבד את הצפון

          פורסם במקור בפורום CODE613 ב09/08/2015 23:02 (+03:00)

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

            אבל לא בקוד. אצלי בכל אופן. <!-- s:-) --><img src="{SMILIES_PATH}/icon_e_smile.gif" alt=":-)" title="מחייך" /><!-- s:-) -->

            פורסם במקור בפורום CODE613 ב09/08/2015 23:25 (+03:00)

            אין טסט כמו פרודקשן.

            המייל שלי urivpn@gmail.com

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

              @softs

              פונקציה כללית לחיפוש יכולה להיראות כך:
              public static IEnumerable<T> SearchString<T>(IEnumerable<T> lst, string sProperty, string sVal)
              {

                  MemberInfo mi = ((MemberInfo)typeof(T).GetField(sProperty) ?? (MemberInfo)typeof(T).GetProperty(sProperty));
              
                  if (mi == null) throw new ArgumentException("Field/Property does not exists", "sProperty");
                  
                  if (mi.MemberType == MemberTypes.Property) 
                  {
                      return lst.Where(d => (((PropertyInfo)mi).GetValue(d) ?? "").ToString().Contains(sVal));
                  }
                  else
                  {
                      return lst.Where(d => (((FieldInfo)mi).GetValue(d) ?? "").ToString().Contains(sVal));
                  }
              }
              

              הפונקציה הזו טובה כשהערך הוא string
              ניסיתי לכתוב מתודה גנרית דומה שיכולה לחפש כשהמאפיין הוא מסוג double או int (כיון שעם הפונקציה הזאת הוא זרק לי חריג שהערך אינו מתאים).
              לא הצלחתי..
              ניסיתי לכתוב בתוך הcontains (double.parse) ואז את הערך.. אבל זה לא הצליח כיון שלפני זה יש Tostring ניסיתי למחוק את זה אבל אז הוא לא נותן לי את הcontains.. בקיצור - הסתבכתי 😢
              אשמח לשמוע מה לעשות...
              וגם מדוע בכלל אתה צריך את הtostring הזה?
              תודה רבה!!

              פורסם במקור בפורום CODE613 ב10/08/2015 23:20 (+03:00)

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

                למה צריך את ה ToString? כי GetValue מחזיר object כי הוא לא יודע מה סוג ה property ואי אפשר להשוות object ל string בלי ToString
                פונקציה כללית:

                public static IEnumerable<T> Search<T>(IEnumerable<T> lst, string sProperty, dynamic Val, bool contains = false)
                {
                    MemberInfo mi = ((MemberInfo)typeof(T).GetField(sProperty) ?? (MemberInfo)typeof(T).GetProperty(sProperty));
                
                    if (mi == null) throw new ArgumentException("Field/Property does not exists", "sProperty");
                
                    if (mi.MemberType == MemberTypes.Property)
                    {
                        PropertyInfo pi = (PropertyInfo)mi;
                
                        return lst.Where(d => Match((pi.GetValue(d) ?? "").ToString(), Val.ToString(), contains));
                    }
                    else
                    {
                        FieldInfo fi = (FieldInfo)mi;
                
                        return lst.Where(d => Match((fi.GetValue(d) ?? "").ToString(), Val.ToString(), contains));
                    }
                }
                
                public static bool Match(string sLeft,string sRight, bool contains)
                {
                    return (sLeft == sRight || (contains && sLeft.Contains(sRight)));
                }
                

                פורסם במקור בפורום CODE613 ב11/08/2015 13:47 (+03:00)

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

                  תודה רבה!
                  תיקון קטן..
                  בפונקציה match צריך להוסיף static אחרת זה מחזיר שגיאה..

                  פורסם במקור בפורום CODE613 ב11/08/2015 14:59 (+03:00)

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

                    @softs

                    return lst.Where(d => Match((pi.GetValue(d) ?? "").ToString(), Val.ToString(), contains
                    
                    public static bool Match(string sLeft,string sRight, bool contains)
                    {
                        return (sLeft == sRight || (contains && sLeft.Contains(sRight)));
                    }
                    

                    אשמח אם תוכל להסביר לי מה בעצם אתה עושה ב2 השורות הללו?
                    תודה רבה רבה!! כנראה שיש לי עוד הרבה פערים להשלים :lol: :lol:

                    פורסם במקור בפורום CODE613 ב11/08/2015 16:08 (+03:00)

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

                      תודה רבה soft על כל העזרה עם הפונקציות!!דרך זה למדתי על עולם שלם שלא כ"כ הכרתי..
                      (על כל ספריית הReflection "שיקוף" בלע"ז :lol: )
                      לאט לאט אני מגלה עולם..
                      ובכל אופן זו הייתה טעות שלי.. הפונקציה הראשונה עובדת טוב גם על מאפיינים של INT וDOUBLE, הייתה לי שגיאה אחרת שבגללה הוא זרק לי את החריג שהערך אינו מתאים 😢
                      בכל אופן תיקנתי אותה.. ועכשיו הכל רץ חלק!! (גם אם אני משתמש בפונקציה הראשונה וגם אם בשניה..)

                      פורסם במקור בפורום CODE613 ב11/08/2015 20:04 (+03:00)

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

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

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

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