156.5. Determinating whether an enumerable has a given size

ראינו בעבר הרחוק (טיפ מספר 15) כיצד ניתן לבדוק האם אוסף מסוים של איברים הוא ריק או לא.

תזכורת: ראינו ששימוש בExtension Method ששמו Count הוא לא יעיל, מאחר ובמקרה הגרוע, זה עובר על כל האיברים באוסף כדי לספור כמה איברים יש בו.

כעת אפשר לשאול כיצד ניתן לדעת האם יש באוסף לפחות שני איברים, או לכל היותר 10 איברים.

כמו בטיפ מספר 15, הדרך הנאיבית:

1
2
3
4
5
6
7
8
9
if (enumerable.Count() >= 2)
{
// ...
}
if (enumerable.Count() <= 10)
{
// ...
}

לא יעילה.

איך נוכל לעשות זאת בדרך אחרת?

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

אופציה מספר 1:

פשוט נפלטר על איברים שהאינדקס שלהם גדול מהמספר הנתון, ועל זה נריץ Any: (ראו גם טיפ מספר 93)

1
2
3
4
5
6
7
8
9
if (enumerable.Where((element, index) => (index >= 1)).Any())
{
// ...
}
if (!enumerable.Where((element, index) => (index >= 10)).Any())
{
// ...
}

הסבר: אנחנו פשוט בודקים האם יש (או אין) איברים עם אינדקס גדול מספיק.

אופציה מספר 2:

לעשות בערך אותו הדבר, אבל בצורה יותר קריאה: פשוט נדלג על האיברים הראשונים ונראה האם מתקבלות תוצאות. זאת באמצעות הExtension Method ששמו Skip:

1
2
3
4
5
6
7
8
9
if (enumerable.Skip(1).Any()) // Count() >= 2
{
// ...
}
if (!enumerable.Skip(10).Any()) // Count() <= 10
{
// ...
}

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

המשך יום בגודל מוערך טוב

שתף