פונקציה שמקבלת כמה טיפוסים וממירה את כולם ומחזירה סטרינג
-
אני צריך לבנות פונקציה שמקבלת כמה סוגי טיפוסים כמו string, int, dateTime וכדו'
צריך שיתאפשר לשלוח לפונקציה מ 2 עד 64 משתנים
ובמבנה הזהstring s = StringConcatenate("string", DateTime, int, ...);
והפונקציה ממירה את כולם לסטרינג ומשרשרת אותם ומחזירה סטרינג אחד
איך אני בונה פונקציה שכזאת?פורסם במקור בפורום CODE613 ב17/05/2016 22:36 (+03:00)
-
@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)
-
בדקת את 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)
-
תודה על העזרה
לבסוף היות שהייתי צריך ששם הפונקציה יהיה בדווקא 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)
-
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)
-
אגב למתודות מעצבנות מהסוג הזה (שכל קיומם אינו אלא בשביל שמם ואין בהם עצמאות של ממש)
מאוד נוח להשתמש עם פיצ'ר של C# 6 שמאפשר להציב בביטוי למבדה את גוף המתודה:public string StringConcatenate(params object[] args) => string.Concat(args);
פורסם במקור בפורום CODE613 ב18/05/2016 21:24 (+03:00)
-
@דוד ל.ט.
public string StringConcatenate(params object[] args) { return string.Concat(args); }
... אלא גם בריחה מאחריות על כל מיני שגיאות אפשריות ושקט נפשי לגבי חלקים שמשהו אחר מטפל.
אני לא יודע למה אבל דבר כל כך פשוט ולא עלה בדעתי... :shock:
תודה רבה עזרת לי מאודפורסם במקור בפורום CODE613 ב18/05/2016 23:02 (+03:00)