93. Where extension method

בהמשך לשבוע שפה מובנית שאילתא,

קיים גם Extension Method שנקרא Where, המאפשר לסנן איברים של IEnumerable

הוא מקבל IEnumerableוdelegate מסוג Func (פרדיקט), ומוצאת כל האיברים שמקיימים את הפרדיקט.

למשל הדוגמה הבאה מוצאת את כל הילדים במשפחה שהגיל שלהם הוא לכל היותר 12:

1
2
3
4
IEnumerable<Person> family = GetFamilyMembers("Banani");
IEnumerable<Person> children =
family.Where(person => person.Age <= 12);

המימוש הוא משהו כזה:

1
2
3
4
5
6
7
8
9
10
11
12
public static IEnumerable<T> Where<T>
(this IEnumerable<T> enumerable,
Func<T, bool> predicate)
{
foreach (T current in enumerable)
{
if (predicate(current))
{
yield return current;
}
}
}

גם כאן יש overload שמבוסס אינדקס:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static IEnumerable<T> Where<T>
(this IEnumerable<T> enumerable,
Func<T, int, bool> predicate)
{
int index = 0;
foreach (T current in enumerable)
{
if (predicate(current, index))
{
yield return current;
}
index++;
}
}

למשל נוכל למצוא את כל האנשים שהגיל שלהם קטן או שווה ל12 והם נמצאים באינדקסים הזוגיים:

1
2
3
IEnumerable<Person> results =
family.Where((person, index) =>
(index%2 == 0) && person.Age <= 12);

המשך יום שפה מובנית שאילתא טוב

שתף