TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.74K subscribers
Post #3272 1.63K
День 2731. #TipsAndTricks
Добавление Статического Свойства Благодаря Расширениям
Вот простой сценарий: у вас есть StringComparer, и вы хотите добавить свой собственный компаратор — например, порядок «естественной сортировки», чтобы «file2» сортировался перед «file10», а не после.

Начиная с C#14 мы можем расширить семейство компараторов и сделать это естественным!

Пре-C#14
Итак, мы хотим добавить и использовать что-то вроде:
public class NaturalSortComparer : StringComparer
{
public override int Compare(string? x, string? y)
=> …
public override bool Equals(string? x, string? y)
=> …
public override int GetHashCode(string obj)
=> …
}


До C#14 у нас были только методы расширения, поэтому мы могли сделать только что-то такое:
public static class StringComparerExtensions
{
public static StringComparer NaturalSort(
this StringComparer comparer)
=> new NaturalSortComparer();
}

Что было бы странно использовать: StringComparer.NaturalSort();. Если вы посмотрите на аналогичные члены, вроде StringComparer.Ordinal или StringComparer.OrdinalIgnoreCase, то это не совсем то, что мы бы хотели.

В качестве альтернативы мы могли создать отдельный класс:
public static class NaturalSort
{
public static StringComparer Instance { get; }
= new NaturalSortComparer();
}

// Использование:
var files = Directory.GetFiles(path)
.OrderBy(f => f, NaturalSort.Instance);

Тоже выглядит не совсем естественно.

C#14
«Расширенные» (простите за каламбур) расширения в C#14 могут также добавлять статические члены, не только методы, но и свойства. Кроме того, в перечислении CompareOptions был добавлен элемент NumericOrdering для натуральной сортировки. Поэтому мы можем создать такое статическое свойство-расширение:
public static class StringComparerExtensions
{
extension(StringComparer)
{
public static StringComparer NaturalSort =>
StringComparer.Create(
CultureInfo.CurrentCulture,
CompareOptions.NumericOrdering
);
}
}


Теперь мы можем использовать его так, как и хотелось:
var files = Directory.GetFiles(path)
.OrderBy(f => f, StringComparer.NaturalSort);


Источник: https://steven-giesel.com/blogPost/605274d2-719b-4b1f-b0d5-3ad9001d9b56/adding-static-getter-thanks-to-extensions
  • 👍 11
More from @netdeveloperdiary
  1. Sep 26, 2026День 2796. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Продолжение Начало Три…
  2. Sep 25, 2026День 2795. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Начало Проблема с позиц…
  3. Sep 24, 2026День 2794. #Оффтоп #Здоровье Сегодня будет необычный пост. Завтра в Москве стартует конфер…
  4. Sep 23, 2026День 2793. #ЗаметкиНаПолях #SQL 10 Редких Возможностей SQL, Которые Стоит Знать Каждому. Ч…
  5. Sep 22, 2026День 2792. #ЗаметкиНаПолях #SQL 10 Редких Возможностей SQL, Которые Стоит Знать Каждому. Ч…
  6. Sep 21, 2026🔍Тестовое собеседование с Senior C# разработчиком уже завтра 22 сентября(уже завтра!) в 1…
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 →