.NET 6: Улучшения в LINQ. Окончание 2/2
Начало
Операторы *By
Это методы
DistinctBy, ExceptBy, IntersectBy, UnionBy¸ MinBy и MaxBy. Первые 4 позволяют работать с коллекциями как со множествами. Для них предусмотрен делегат keySelector, возвращающий ключ для сравнения. Методы позволят выполнять операцию сравнения на подмножестве данных, а не на всей коллекции. Их можно использовать для повышения производительности или для обеспечения настраиваемого поведения без потери исходных данных. Например, имея коллекции всех заказов и завершённых заказов:IEnumerable<Order> all = GetAll();Получить незавершённые заказы можно с помощью
IEnumerable<Order> completed = GetCompleted();
ExceptBy, сравнивая элементы по свойству ID:IEnumerable<Order> remaining =В отличие от варианта с использованием
all.ExceptBy(completed, o => o.ID);
Where, который менее интуитивно понятен и выполняется за квадратичное время (O(M*N)).В
MinBy и MaxBy вместо селектора ключей предоставляется селектор элементов. Они вернут элемент коллекции с наибольшим/наименьшим значением соответственно, в отличие от существующих Min и Max, которые возвращают само значение. Кроме того, в каждый из методов (в том числе и Min и Max) можно будет передать необязательный объект-компаратор.Сигнатуры всех методов похожи, приведу для примера
DistinctBy и MinBy с компаратором:public static IEnumerable<TSource>Улучшение в *OrDefault
DistinctBy<TSource, TKey>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector);
public static TSource
MinBy<TSource, TResult>(
this IEnumerable<TSource> source,
Func<TSource, TResult> selector,
IComparer<TResult>? comparer);
Вариант оператора *OrDefault используется для предоставления значения по умолчанию, когда
Single, First или Last передаётся пустая коллекция. В этой функции теперь можно будет переопределить возвращаемое значение по умолчанию: public static TSourceПримечание: обратите внимание, что во всех описанных выше методах расширения есть как версия
SingleOrDefault<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate,
TSource defaultValue);
IEnumerable, так и версия IQueryable. Все новые API, возвращающие IEnumerable, должны включать соответствующую версию IQueryable. Это не позволит пользователю API преобразовать запрос в обычное перечисление, не осознавая этого.Источник: https://www.infoq.com/news/2021/04/Net6-Linq/