תשרי

איך לבדוק אם רשימה ריקה

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

 if(items == null || items.Count() == 0) 

ואז הוא פוסל את התנאי הזה בגלל חלקו השני – זה שפונה לפונקציית ה-count. לטענתו, אין אמנם בעיה כאשר האובייקט Items מיישם את הממשק ICollection<T>, אבל אם items אינו מיישם אותו – אזי הפונקציה count תעבור על כל הרשימה כדי לספור את כמות האיברים.

הפתרון שהוא מציע הוא אם נמיר את השאלה “כמה איברים יש ברשימה” – שאת התשובה לה תיתן לנו הפונקציה count – בשאלה “האם יש איברים ברשימה”. את התשובה לזה תיתן לנו הפונקציה Any(), והיתרון שלה הוא שהיא עושה MoveNext על הרשימה פעם אחת בלבד.

לסיום הוא מציע לעטוף את התנאי החדש:

if(items == null || !items.Any())

כפונקציית הרחבה (extension method).

אבל כמובן שדרכם של מתכנתים, ברגע שמתחילים להיות פדנטים, תמיד יקום מישהו שהוא עוד יותר פדנט, וימצא בעיה בקוד של הפדנט הקודם…

וכך הגיע אורן עיני, וכתב גם הוא פוסט על איך לבדוק אם רשימה היא ריקה. הבעיה שהוא מוצא בקוד של פיל האק היא במקרה שאחרי התנאי – כלומר, אחרי שקראנו לפונקציה Any – רוצים לעבור על כל הרשימה (למשל כדי להדפיס אותה). המעבר על הרשימה הוא כמובן בעזרת הפקודה foreach. ההנחה שלנו היא שה-foreach יתחיל מתחילת הרשימה ויעבור על כולה. אולם למעשה, אחרי שהרצנו את Any, המעבר על הרשימה לא מתחיל מחדש, אלא ממשיך מהמקום השני!

הוא נותן פתרון בפוסט שלו, שהוא 9 שורות קוד…

כנראה פתרון נכון, אבל כמה שורות קוד בשביל מקרה קצה של מקרה קצה…

כתבו תגובה

כתובת הדוא"ל שלכם לא תוצג.