101. let keyword pitfalls

הכרנו את המילה השמורה let.

אחד הpitfallים הנפוצים הוא הדבר הבא, נניח שאנחנו רוצים לבצע שאילתא על דברים שהם לא null.

אפשר לכתוב את זה כך:

1
2
3
4
5
IEnumerable<Person> children =
from person in family
let age = person.Age
where (person != null) && (age <= 12)
select person;

אלא שזה מתקמפל אבל לא כל כך עובד.

מה הבעיה? אם יש לנו nullים בתוך family, אנחנו נעוף. למה?

כזכור, הקוד מתקמפל לקוד הבא:

1
2
3
4
IEnumerable<Person> children =
family.Select(person => new {person, age = person.Age})
.Where(pair => (pair.person != null) && (pair.age <= 12))
.Select(pair => pair.person);

מה שחשוב זו השורה של הSelect.

מה הבעיה כאן? הדבר הראשון שמתבצע זה Select, ורק אחריו כל השאר. לכן אנחנו ניגשים תחילה עבור כל איש באוסף ומחשבים את לperson.Age.

רק אחר כך אנחנו מסננים את האנשים שהם לא null, אבל זה מאוחר מדי, ולכן נעוף בהתחלה.

איך נפתור את זה? אפשר בצורה הבאה:

1
2
3
4
5
6
IEnumerable<Person> children =
from person in family
where (person != null)
let age = person.Age
where (age <= 12)
select person;

בתחילה נסנן את כל האנשים שהם null, ורק אחר כך נחשב את כל שאר הדברים.

הערה:

כמובן נתתי פה דוגמה של משהו פשוט, שמסננים את האיברים עצמם, אבל אפשר ליפול בצורה דומה, גם בגישה לProperty של איבר. זה משהו נפוץ שראיתי..

שתף