מה חדש בNET 6 LINQ.
-
הגירסה החדשה של NET. תוכרז במהלך החודש הבא באירוע NET Conf 2021 היוקרתי של מיקרוסופט, היא תכלול שיפורים רבים במגוון מחלקות, אחת מהיותר מעניינות שבינהן היא
Enumerable
, מספר מתודות Linq חדשות התווספו למחלקה, לצד הוספת Overloads חדשים עבור מתודות קיימות.ברשותכם הייתי רוצה לסקור כאן כמה מהחידושים שמצאו חן בעיני.
- Chunking
אם יצא לכם לעבוד עם מבני נתונים גדולים, ודאי נתקלתם בצורך לחלק אוסף גדול למספר אוספים קטנים, בדיוק בשביל זה נולדה המתודהChunk
, המתודה מקבלת כפרמטר את הגודל הרצוי ומחזירהIEnumrable
של תתי מערכים:
public static IEnumerable<TSource[]> Chunk<TSource>(this IEnumerable<TSource> source, int size);
private record Person(int Age)
int chunkSize = 10; IEnumerable<Person> largeCollecton = Enumerable.Range(0, 1_000).Select(age => new Person(age)); IEnumerable<Person[]> chunks = largeCollecton.Chunk(chunkSize); foreach (var chunk in chunks) { foreach (var person in chunk) { Console.WriteLine(person); } }
-
MaxBy\MinBy
המתודה מאפשרת לקבוע את האובייקט הגדול\הקטן באוסף ע"פ המאפיינים של האוביקטים, בשונה מMax\Min הוותיקים שמבצעים את ההשוואה מול האוביקטים עצמם.
לדוגמא: אם נרצה לקבוע מיהו האדם המבוגר באוסף של מופעים מסוגPerson
, נבצע את המשימה כך:people.MaxBy(x => x.Age)
, עד כמה שהדבר מוזר, האפשרות טרם הייתה קיימת עד כה, הדרך המקובלת הייתה השילוב הלא חביב דלהלן:
()people.OrderByDescending(x => x.Age).First
.
כמו כן נוספו: DistinctBy ,ExceptBy ,IntersectBy וUnionBy בעלי עיקרון דומה. -
תמיכה בRange
מכירים את Range מC# 8? עד היום התמיכה הייתה בלעדית למערכים, מעתה התמיכה מתרחבת לLinq, לדוגמא:people.Take(6..10)
יחזיר ארבעה אובייקטים, מהאובייקט במיקום השישי עד האובייקט במיקום העשירי (מקביל לpeople.Skip(6).Take(4)
). -
ערך דיפולטיבי עבור SingleOrDefault ,LastOrDefault ,FirstOrDefault
המתודות הנ"ל יקבלו Overload חדש התומך בערך ברירת מחדל.
בדוגמא דלהלן אנו ננסה למצוא באוסף מסוגPerson
, אדם שגילו הוא חמישים, ונחזיר מופע חדש (המצייג אדם שגילו הוא 50) במידה וניכשל:
people.FirstOrDefault(m => m.Age == 50, new(){ Age = 50 })
-
Zip עבור שלושה Enumrables
כיום התמיכה מוגבלת עבור שניים בלבד. -
TryGetNonEnumeratedCount
המתודה תנסה לקבוע את מספר האוביקטים בEnumrable
מבלי לבצע איטרציה (פעולה העשויה להיות יקרה), כחלק מהתהליך המתודה תבדוק האם הEnumerable
מממש אתICollection
(המכיל מאפיין בשםCount
), או לחילופין האם הוא מערך (המכיל מאפיין בשםLength
).
מקווה שנהנתם מהפוסט ושמצאתם אותו כשימושי, בהצלחה.
- Chunking