Полезные Расширения для IEnumerable. Начало
Мы уже рассматривали расширения для Task<T>, сегодня рассмотрим расширения для
IEnumerable.
Примечание: Будьте осторожны, если ваш тип IQueryable, потому что расширение может материализовать запрос. Вместо IEnumerable вы можете использовать IReadOnlyCollection, чтобы удостовериться, что вы имеете дело с материализованной коллекцией.
1. IsNullOrEmpty
Метод аналогичен методу для строк:
public static bool IsNullOrEmpty<T>(Использование:
this IEnumerable<T>? source)
=> source is null || !source.Any();
Enumerable.Empty<int>().IsNullOrEmpty();2. Разделение
// true
new[] { 1, 2 }.IsNullOrEmpty();
// false
((IEnumerable<int>)null).IsNullOrEmpty();
// true
Популярная операция над коллекциями: одна коллекция содержит все элементы, соответствующие предикату, другая – все не соответствующие:
public static (IEnumerable<T> True, IEnumerable<T> False)Использование:
Partition<T>(
this IEnumerable<T> source,
Func<T, bool> predicate)
{
ArgumentNullException.ThrowIfNull(source);
ArgumentNullException.ThrowIfNull(predicate);
var trueItems = new List<T>();
var falseItems = new List<T>();
foreach (var item in source)
{
if (predicate(item))
trueItems.Add(item);
else
falseItems.Add(item);
}
return (trueItems, falseItems);
}
var numbers = Enumerable.Range(0, 5);3. Медиана
var (even, odd) =
numbers.Partition(n => n % 2 == 0);
LINQ предоставляет метод Average для среднего арифметического, но нет метода для медианного значения:
public static double Median<T>(Использование:
this IEnumerable<T> source)
where T : IConvertible
{
ArgumentNullException.ThrowIfNull(source);
var sorted = source
.Select(x => x.ToDouble(
CultureInfo.InvariantCulture))
.OrderBy(x => x).ToList();
var count = sorted.Count;
if (count == 0)
throw new InvalidOperationException(
"Исходная коллекция пуста.");
if (count % 2 == 0)
return (sorted[count / 2 - 1] + sorted[count / 2]) / 2;
return sorted[count / 2];
}
var median = new[] { 1, 1, 1, 1, 5, 6, 7, 8, 9 }
.Median(); // 5
var average = new[] { 1, 1, 1, 1, 5, 6, 7, 8, 9 }
.Average(); // 4.333333333333333
Окончание следует…Источник: https://steven-giesel.com/blogPost/1b8eaaef-01a3-4799-9a96-f0d37197d175