Аргументы Выражений Коллекций в C #15
В репозитории .NET появилось неплохое предложение, которое немного улучшит работу с выражениями коллекций — предоставление пользователям возможности передавать аргументы при создании.
Замечание: пока это только предложение, и оно может появиться в C# 15 (или, вероятно, позже), а может и никогда.
Что такое выражения коллекций?
Вкратце: выражения коллекций — это альтернативный синтаксис для создания коллекций в C#:
List<int> evens = [2, 4, 6, 8, 10];
List<int> odds = [1, 3, 5, 7, 9];
// Сливаем обе коллекции и добавляем 0 в начало
List<int> all = [0, ..evens, ..odds];
Естественно, это работает не только с List<T>, но и с любым типом, который реализует определённый шаблон. См. подробнее.
Преимущество в том, что синтаксис более лаконичен, а в некоторых случаях, возможно, и улучшается производительность.
Но и это можно улучшить!
Здесь в случае с all компилятор создаст новый List с нужной ёмкостью:
num2 = 1 + (list4.Count + list5.Count);
List<int> list6 = new List<int>(num2);
Но бывают случаи, когда компилятор не знает, сколько элементов будет в коллекции, а вы знаете (например, при обращении к базе данных). Сейчас у нас нет возможности указать ёмкость списка в выражении коллекции. Но предлагаемый вариант позволит это изменить. Как уже говорилось ранее, это всего лишь предложение, и синтаксис, используемый в следующем примере, не окончательный (и, откровенно говоря, выглядит он пока странно):
List<int> all =
[args(capacity: 32), 0, ..evens, ..odds];
Это сразу создаст список вместимостью 32 (хотя это и не очень полезно, но суть понятна). В итоге получится
new List<int>(32);. Это может пригодиться и в других случаях. Например, HashSet<T> позволяет передавать IEqualityComparer<T> для сравнения строк:HashSet<string> names =
[args(comparer: StringComparer.OrdinalIgnoreCase), "Alice", "Bob", "alice"];
Источник: https://steven-giesel.com/blogPost/352fe495-9cc4-4df8-8ad1-a3e26a64185c/collection-expression-arguments-in-c-15