מדי פעם אנחנו רואים קוד כזה
|
|
בו משרשרים הרבה מחרוזות עם איזשהו מפריד ביניהן.
בדרך כלל האיטרציה היא על איזשהו IEnumerable ולאו דווקא כפי שעשיתי.
הבעיה בסיפור הזה היא שהסיבוכיות כאן היא $ o(n^2) $, כי כל איטרציה אנחנו יוצרים אובייקט חדש ובעצם מעתיקים את כל האובייקט הקודם כפי שהוא! (הרי ידוע שstring הוא Immutable)
בנוסף עצם העובדה שבסוף אנחנו צריכים להסיר את האובייקט האחרון רק מכבידה על העניין.
יבואו הצדיקים ויאמרו, השתמש בStringBuilder. כך נראה הקוד עם StringBuilder:
|
|
כעת הסיבוכיות היא $ o(n) $, עם זאת עדיין משהו פה לא כל כך יפה.
הפתרון: השתמשו בstring.Join:
|
|
הערה:
גם פה יש משהו שהוא קצת לא יפה, כיוון שצריך לעשות ToArray בשביל הפונקציה string.Join. אישית אני לא חושב שזה כל כך נורא, וזה יותר קריא משתי הדוגמאות הקודמות (שם לא כל כך ברור מיידית מתי צריך להסיר את השרשור האחרון).
אפשר לפתור את הבעיה אם אתם משתמשים בFramework 4, אז יש overloadים חדשים לstring.Join. ביניהם יש גם overload שמקבלIEnumerable<T>,המבצע פשוט Join של הToString() של כל אובייקט בIEnumerable.
כך יראה הקוד בnet 4:
|
|
או כך, אם אתם מעדיפים לכתוב בLINQ
|
|
(ניתן לכתוב את הגרסה של LINQ בnet 3.5, אבל תצטרכו לקרוא לJoin עם הToArray של IEnumerable<T>)