Существует ли эквивалент Comparator.comparing из Java в NET?

Помогите разобраться с данным кодом

 getAllMatchers()
            .stream()
            .sorted(Comparator.comparing(Matcher::getSourceFileName).thenComparingLong(Matcher::getSourceFileLineNumber))

конкертно с последней строчкой, не могу понять, что значит .thenComparingLong и какой у нее есть (если есть) эквивалент в C#?


Ответы (1 шт):

Автор решения: Blackmeser

Не знаю что там в java, но компараторы в .NET есть, и возможности их широки, можно писать свои и использовать их в лямбда-функциях.

Предположительно что делает код, по порядку:

  1. Берёт какой-то список элементов, пусть будет List<Element>
  2. Пихает элемент в сортировщик с указанием корпаратора
  3. Корпаратор работает на основе сравнения имён файлов элементов
  4. Получает сортированные группы элементов на основе имён файлов по типу Dictionary<string, List<Element>>
  5. Производит вторичную сортировку для второго параметра элемента Element getSourceFileLineNumber (где он его берёт - неизвестно, возможно это исходный номер элемента в неком списке)
  6. На выходе сортированный List<Element>

Без понимания контекста, что там за данные (что за параметры getSourceFileLineNumber и getSourceFileName) на входе подробнее не скажешь.

В C# это можно реализовать следующим образом (даже без компаратора):

getAllMatchers()
   .OrderBy(y => y.getSourceFileName)
   .ThenBy(y => y.getSourceFileLineNumber)

Компараторы потребуются если мы хотим поменять принципы сравнения, или сравнить сложные параметры или уйти от комбинации OrderBy с ThenBy, чтобы использовать обычный Sort для класса целиком.

PS крайне полезная информация, если вам действительно потребуется компаратор https://metanit.com/sharp/tutorial/3.23.php

→ Ссылка