Создание кортежа с помощью конструктора выглядит громоздко. Чтобы облегчить синтаксис создания кортежей существует класс Tuple
с серией статических методов, создающих кортежи:
1 | var t1 = Tuple.Create(42, "abc"); |
Полезное свойство кортежей состоит в том, что они реализуют интерфейс IComparable
, сравнивающий кортежи по компонентам. То есть Tuple.Create(1, 2) будет меньше Tuple.Create(2, 1). Этот интерфейс по умолчанию используется в методах сортировки и поиска минимума/максимума.
Использование данного факта рассмотрим на примере:
Дан текст. Нужно составить список всех встречающихся в тексте слов, упорядоченный сначала по возрастанию длины слова, а потом лексикографически. Удивительно, но данную задачу можно решить совсем не используя ThenBy
.
Наивное решение заключается в том, чтобы сформировать нужные кортежи, отсортировать их, а затем извлечь вторые компоненты кортежей, содержащих решение:
1 | public static List<string> GetSortedWords(string text) |
Однако следует напомнить, что keySelector функции OrderBy — это функция, которая каждому элементу последовательности ставит в соответствие некоторый ключ, по которому его будут сравнивать при сортировке. Поэтому решение можно записать намного короче, поместив кортеж (типа ValueTuple) в keySelector функции OrderBy:
1 | public static List<string> GetSortedWords(string text) |
Вывод программы можно увидеть ниже:
1 | GetSortedWords("A box of biscuits, a box of mixed biscuits, and a biscuit mixer.") |