104. SkipWhile extension method

בדומה לטיפ של אתמול, נניח שיש לנו Log של שגיאות, ומעניין אותנו להתחיל לסרוק את הLog החל מהשגיאה הראשונה.

בניגוד למקרה של אתמול, בו רצינו לחתוך את האוסף של השגיאות ברגע בו מתחילה השגיאה הראשונה, במקרה זה הקוד הקלאסי שאנחנו צריכים לכתוב הוא יותר מסובך:

1
2
3
4
5
6
7
8
9
10
11
12
13
bool firstError = false;
foreach (LogInfo logInfo in log)
{
if (!firstError && logInfo.Error)
{
firstError = true;
}
if (firstError)
{
// Start working from this point
}
}

גם כאן יש לנו Extension Method שמאפשר לנו לבצע פעולה זו בדרך נחמדה יותר, לו קוראים SkipWhile. הוא מקבל פרדיקט וחותך את האוסף, כך שיתחיל מהאיבר הראשון שלא מקיים את הפרדיקט.

נוכל לכתוב במקום את הקודם מעלה, את הקוד הבא:

1
2
3
4
5
6
7
IEnumerable<LogInfo> afterFirstError =
log.SkipWhile(logInfo => !logInfo.Error);
foreach (LogInfo logInfo in afterFirstError)
{
// Start working from this point
}

SkipWhile כמובן עובדת בצורה דומה למה שכתבנו למעלה.

כמו בTakeWhile, ורוב הדברים בLINQ, גם כאן יש overload שמתחשב גם באינדקס של האיבר:

1
2
3
IEnumerable<LogInfo> afterFirstError =
log.SkipWhile((logInfo, index) =>
!((logInfo.Error) || (index > 100)));

חותך את 100 האיברים הראשונים, או החל מהשגיאה הראשונה.

הערה מעניינת:

הReSharper יודע לזהות לולאות של TakeWhile ולהציע להפוך אותן לשימוש בExtension Method במקום, אבל הוא לא יודע לעשות את זה עם לולאות SkipWhile.

(למרות שלא קשה לכתוב Highlighting Pattern כזה)

שתף