TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.77K subscribers
Post #1947 1.43K
День 1601. #ЗаметкиНаПолях
Полезные Расширения для 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();
// true
new[] { 1, 2 }.IsNullOrEmpty();
// false
((IEnumerable<int>)null).IsNullOrEmpty();
// true

2. Разделение
Популярная операция над коллекциями: одна коллекция содержит все элементы, соответствующие предикату, другая – все не соответствующие:
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);
var (even, odd) =
numbers.Partition(n => n % 2 == 0);

3. Медиана
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
  • 👍 14
More from @netdeveloperdiary
  1. Oct 10, 2026День 2810. #ЧтоНовенького #VSCode Более Быстрый и Лёгкий C# Dev Kit Мы, разработчики, люби…
  2. Oct 9, 2026День 2809. #Карьера 5 Навыков, Которые Помогут Быстрее Стать Сеньором. Окончание Начало 3.…
  3. Oct 8, 2026День 2808. #Карьера 5 Навыков, Которые Помогут Быстрее Стать Сеньором. Начало В ИТ есть се…
  4. Oct 7, 2026День 2807. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Окончание Нач…
  5. Oct 6, 2026🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК Приглашаем на открытое собес…
  6. Oct 6, 2026День 2806. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Начало Больши…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →