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

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

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

פונקציה שמקבלת כמה טיפוסים וממירה את כולם ומחזירה סטרינג

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

    אני צריך לבנות פונקציה שמקבלת כמה סוגי טיפוסים כמו string, int, dateTime וכדו'
    צריך שיתאפשר לשלוח לפונקציה מ 2 עד 64 משתנים
    ובמבנה הזה

    string s = StringConcatenate("string", DateTime, int, ...);
    

    והפונקציה ממירה את כולם לסטרינג ומשרשרת אותם ומחזירה סטרינג אחד
    איך אני בונה פונקציה שכזאת?

    פורסם במקור בפורום CODE613 ב17/05/2016 22:36 (+03:00)

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

      @Zvi Good

      אני צריך לבנות פונקציה שמקבלת כמה סוגי טיפוסים כמו string, int, dateTime וכדו'
      צריך שיתאפשר לשלוח לפונקציה מ 2 עד 64 משתנים
      ובמבנה הזה

      string s = StringConcatenate("string", DateTime, int, ...);
      

      והפונקציה ממירה את כולם לסטרינג ומשרשרת אותם ומחזירה סטרינג אחד
      איך אני בונה פונקציה שכזאת?

      אתה יכול להשתמש ב Params כדי לאפשר אורך קלט משתנה, וכדי לאפשר סוגי משתנים שונים תנסה עם Object שהוא האבא של כולם.
      כמו בקישור הבא:
      והנה הקוד הרלוונטי משם:

      public static void UseParams2(params object[] list)
          {
              for (int i = 0; i < list.Length; i++)
              {
                  Console.Write(list[i] + " ");
              }
              Console.WriteLine();
          }
      

      והשימוש בו:

      UseParams2(1, 'a', "test");
      
       object[] myObjArray = { 2, 'b', "test", "again" };
              UseParams2(myObjArray);
      

      אולי במקום Object תנסה להשתמש בdynamic שאתה מאפשר בזמן ריצה להגדיר באיזה משתנה מדובר (לא בטוח שזה יעזור לך..)
      בהצלחה!

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

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

        בדקת את string.Concat? זה ממש נראה מה שאתה רוצה:

        string.Concat("STRING", DateTime.Now, 500, 1.3)
        

        התוצאה היא:
        STRING17/05/2016 23:17:165001.3

        הפונקציה הזו בעצם מקבלת פרמטרים מסוג אובייקט מה שאומר שמתבצעת עטיפה (boxing) לפרמטרים פרימיטיביים ואח"כ מתבצעת קריאה לToString().
        בשביל לאפשר מספר משתנה של משתנים השתמשו שם בכמה טכניקות: הטפשית - כתיבת מתודה נפרדת לכל מספר של פרמרטים (למה? ככה), והחכמה ע"י מילת המפתח params שמאפשרת לטפל בריבוי פרמטרים (1 ויותר מאותו הטיפוס). עוד דרך זה לקבל אוסף כמו מערך או ליסט וזה מומש במתודה שמקבלת IEnumerable<object>.

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

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

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

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

          תודה על העזרה :smile:
          לבסוף היות שהייתי צריך ששם הפונקציה יהיה בדווקא StringConcatenate אז בניתי את הפונקציה הזאת

          public string StringConcatenate(params object[] args)
                  {            
                          string str = "";
                          foreach (var item in args)
                          {
                              str += item;
                          }
                          return str;
                  }
          

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

          פורסם במקור בפורום CODE613 ב18/05/2016 20:21 (+03:00)

          תגובה 1 תגובה אחרונה
          0
          • dovidD מנותק
            dovidD מנותק
            dovid ניהול
            כתב ב נערך לאחרונה על ידי
            #5
            public string StringConcatenate(params object[] args)
            {
            	return string.Concat(args);
            }
            

            להשתמש במתודה מובנית במקום מימוש עצמי זה חובה ברוב המקרים. זה לא רק חיסכון קוד, וזה לא רק יעילות (במקרה כמו שלך זה מכין סטרינג ארוך מראש כאורך כלל האובייקטים ורק אח"כ ממלא את הסטרינג בגישה ישירה לזיכרון עם מצביעים) אלא גם בריחה מאחריות על כל מיני שגיאות אפשריות ושקט נפשי לגבי חלקים שמשהו אחר מטפל. בשביל הספורט כיף לממש לבד, אבל בחיים האמיתיים זו לא חריצות אלא כמעט סכלות...
            אם מעניין אותך הנה קוד המקור של string.Concat
            http://referencesource.microsoft.com/#mscorlib/system/string.cs,40825b9a6e8f4b1e

            פורסם במקור בפורום CODE613 ב18/05/2016 21:19 (+03:00)

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

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

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

              אגב למתודות מעצבנות מהסוג הזה (שכל קיומם אינו אלא בשביל שמם ואין בהם עצמאות של ממש)
              מאוד נוח להשתמש עם פיצ'ר של C# 6 שמאפשר להציב בביטוי למבדה את גוף המתודה:

              public string StringConcatenate(params object[] args) => string.Concat(args);
              

              פורסם במקור בפורום CODE613 ב18/05/2016 21:24 (+03:00)

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

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

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

                @דוד ל.ט.

                public string StringConcatenate(params object[] args)
                {
                	return string.Concat(args);
                }
                

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

                אני לא יודע למה אבל דבר כל כך פשוט ולא עלה בדעתי... :shock:
                תודה רבה עזרת לי מאוד

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

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

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

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

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