Типы кортежей (справочник по C#)
Кортежи, доступные в C# 7.0 и более поздних версиях, предоставляют краткий синтаксис для группирования нескольких элементов данных в упрощенную структуру данных. В следующем примере показано, как можно объявить переменную кортежа, инициализировать ее и получить доступ к ее элементам данных.
Типы кортежей являются типами значений, а элементы кортежа — общедоступными полями. Поэтому кортежи представляют собой изменяемые типы значений.
Можно определить кортежи со сколь угодно большим числом элементов.
Варианты использования кортежей
Чаще всего кортежи используются как возвращаемый методом тип. То есть вместо определения параметров метода out можно сгруппировать результаты метода в возвращаемый тип кортежа, как показано в следующем примере.
Как показано в предыдущем примере, с возвращаемым экземпляром кортежа можно работать напрямую или деконструировать его в отдельные переменные.
Типы кортежей можно также использовать вместо анонимных типов, например в запросах LINQ. Дополнительные сведения см. в статье Выбор между анонимными типами и кортежами.
Как правило, кортежи используются для группирования слабо связанных элементов данных. Это целесообразно в закрытых и внутренних служебных методах. При работе с общедоступным API рассмотрите возможность определения типа класса или структуры.
Имена полей кортежей
Имена полей кортежей указываются явным образом либо в выражении инициализации кортежа, либо в определении типа кортежа, как показано в следующем примере.
Начиная с C# 7.1, если имя поля не указано, оно может быть выведено из имени соответствующей переменной в выражении инициализации кортежа, как показано в следующем примере.
Это называется инициализаторами проекций кортежа. Имя переменной не проецируется на имя поля кортежа в следующих случаях:
В этих случаях необходимо либо явно указать имя поля, либо получить доступ к полю по имени по умолчанию.
Во время компиляции компилятор заменяет имена полей не по умолчанию соответствующими именами по умолчанию. В результате явно указанные или выводимые имена полей будут недоступны во время выполнения.
Присваивание и деконструкция кортежей
В C# поддерживается присваивание между типами кортежей, которые соответствуют обоим следующим условиям:
Значения элементов кортежа присваиваются в порядке расположения элементов кортежа. Имена полей кортежа не учитываются и не присваиваются, как показано в следующем примере.
Оператор присваивания = можно также использовать для деконструкции экземпляра кортежа в отдельные переменные. Существует три способа деконструкции кортежа.
Вы можете явно объявить тип каждой переменной в скобках.
Вы можете использовать ключевое слово var за пределами круглых скобок, чтобы объявить неявно типизированные переменные и позволить компилятору вывести их типы.
Вы можете использовать существующие переменные.
Подробнее о деконструкции кортежей с помощью и других типов см. в статье Деконструкция кортежей и других типов.
Равенство кортежей
Два кортежа сравнимы, если выполнены оба следующих условия:
Кортежи как параметры вывода
Кортежи и System.Tuple
Кортежи C# с типами System.ValueTuple, отличаются от кортежей, представленных типами System.Tuple. Основные различия заключаются в следующем.
Спецификация языка C#
Дополнительные сведения см. в следующих примечаниях к предлагаемой функции.
Tuples / Кортежи в Python
По аналогии со списками кортежи в Python — это стандартный тип, позволяющий хранить значения в виде последовательности. Они полезны в тех случаях, когда необходимо передать данные, не позволяя изменять их. Эти данные могут быть использованы, но в оригинальной структуре изменения не отобразятся.
В этом руководстве вы познакомитесь с кортежами Python в подробностях:
Кортеж Python
Эта структура данных используется для хранения последовательности упорядоченных и неизменяемых элементов.
Примечание: type() — это встроенная функция для проверки типа данных переданного параметра.
Кортежи могут включать однородные и разнородные значения. Но после объявления их уже нельзя будет поменять:
Последняя ошибка появилась из-за попытки поменять значения внутри кортежа.
Кортежи можно создавать и вот так:
Кортежи против списков
Как вы могли заметить, кортежи очень похожи на списки. По сути, они являются неизменяемыми списками. Это значит, что после создания кортежа хранимые в нем значения нельзя удалять или менять. Добавлять новые также нельзя:
Ошибка появляется, потому что нельзя добавлять новые элементы в кортеж, что работает в случае со списками.
Но зачем использовать этот тип данных, если он неизменяемый?
Кортежи не только предоставляют доступ только для чтения к элементам, но и работают быстрее списков. Рассмотрим в качестве примера следующий код:
Какую роль играет неизменяемость в случае с кортежами?
Добавить элемент в кортеж нельзя, поэтому появляется последняя ошибка AttributeError. Вот почему эта структура данных неизменна. Но всегда можно сделать вот так:
Это позволяет изменять оригинальный кортеж? Куда в таком случае делась их неизменяемость?
Суть в том, что id списка в кортеже не меняется несмотря на добавленный в него элемент 5.
Теперь вы знаете следующее:
Некоторые кортежи (которые содержат только неизменяемые объекты: строки и так далее) — неизменяемые, а другие (содержащие изменяемые типы, например, списки) изменяемые. Но это очень обсуждаемая тема среди программистов на Python и необходимы кое-какие познания, чтобы полностью понять ее. В целом же кортежи неизменяемые.
Так что если вы планируете использовать постоянный набор значений для перебора, используйте кортеж вместо списка. Он будет работать быстрее. Плюс, это безопаснее, ведь такой тип данных защищен от записи.
Если вы хотите узнать больше о списках Python, обязательно ознакомьтесь с этим руководством!
Стандартные операции с кортежами
Python предоставляет несколько способов для управления кортежами. Рассмотрим их на примерах.
Срезы
Можно использовать и отрицательные значения:
Индексы позволяют получать отдельные элементы, а с помощью срезов становятся доступны и подмножества. Для этого нужно использовать диапазоны индексов:
Частота в данном случае является опциональным параметром, а его значение по умолчанию равно 1.
Совет: значение частоты может быть и негативным, чтобы развернуть кортеж.
Объединение кортежей
Можно объединять кортежи для создания нового объекта. Операция объединения выполняет конкатенацию двух кортежей.
Разрешается объединять только определенные типы данных. Так, попытка соединить кортеж и список закончится ошибкой.
Умножение кортежей
Операция умножения приводит к тому, что кортеж повторяется несколько раз.
Функции кортежей
count() и len()
count() возвращает количество повторений элемента в кортеже.
len() — длину кортежа:
Функция может быть полезной, если кортеж вызывается? и нужно удостовериться, что он не пустой.
tuple()
Функция tuple() используется для конвертации данных в кортеж. Например, так можно превратить список в кортеж.
min() и max()
Функция max() q возвращает самый большой элемент последовательности, а min() — самый маленький. Возьмем следующий пример:
Эти функции можно использовать и для кортежей со строками.
С помощью этой функции можно вернуть сумму элементов в кортеже. Работает только с числовыми значениями.
sorted()
Чтобы получить кортеж с отсортированными элементами, используйте sorted() как в следующем примере:
Но важно отметить, что возвращаемый тип — список, а не кортеж. При этом последовательность в оригинальном объекте неизменна, а сам он остается кортежем.
Присваивание несколько кортежей
Кортежи можно использовать для присваивания нескольких значений одновременно. Вот так:
Выводы
Теперь вы знаете, что такое кортежи, как их создавать, какие самые распространенные операции, и как ими можно управлять. Также — распространенные методы структур Python. А в качестве бонуса научились присваивать нескольким переменным разные значения.
Кортежи (Visual Basic)
Создание экземпляров и использование кортежа
Вы создаете экземпляр кортежа, заключая в круглые скобки значения, разделенные запятыми. Каждое из этих значений затем превращается в поле кортежа. Например, следующий код определяет тройной (или 3-кортежный) элемент, а в качестве Date его первого значения в String качестве второго, а в Boolean качестве третьего.
поля Visual Basic кортежа доступны для чтения и записи; После создания экземпляра кортежа можно изменить его значения. В следующем примере изменяются два из трех полей кортежа, созданного в предыдущем примере, и отображается результат.
Создание экземпляров и использование именованного кортежа
Выводимые имена элементов кортежа
начиная с Visual Basic 15,3, Visual Basic может определять имена элементов кортежа. их не нужно назначать явным образом. Выводимые имена кортежей полезны при инициализации кортежа из набора переменных и если имя элемента кортежа должно совпадать с именем переменной.
поскольку элементы и переменные имеют одинаковое имя, компилятор Visual Basic может вывести имена полей, как показано в следующем примере.
чтобы включить выводимые имена элементов кортежа, необходимо определить версию компилятора Visual Basic для использования в файле проекта Visual Basic ( * vbproj):
номер версии может быть любой версией компилятора Visual Basic, начиная с 15,3. вместо того чтобы жестко программировать конкретную версию компилятора, можно также указать «Latest» в качестве значения LangVersion для компиляции с последней версией компилятора Visual Basic, установленного в системе.
Имя кандидата дублируется в кортеже.
Кортежи и структуры
Пользовательские элементы. Нельзя определить собственные свойства, методы или события для кортежа.
Проверка. Невозможно проверить данные, назначенные полям.
Неизменяемость. Visual Basic кортежи являются изменяемыми. В отличие от этого, пользовательская структура позволяет контролировать, является ли экземпляр изменяемым или неизменяемым.
если важны пользовательские члены, проверка свойств и полей или неизменность, следует использовать инструкцию Visual Basic Structure для определения пользовательского типа значения.
Кроме того, типы ValueTuple реализуют IStructuralComparable IStructuralEquatable интерфейсы и, которые позволяют определять пользовательские компараторы.
Назначение и кортежи
Visual Basic поддерживает присваивание между типами кортежей, которые имеют одинаковое число полей. Типы полей можно преобразовать, если выполняется одно из следующих условий.
Исходное и целевое поля имеют один и тот же тип.
Определено расширяющее (или неявное) преобразование исходного типа в целевой тип.
Другие преобразования в контексте назначений не учитываются. Рассмотрим возможные виды назначений между типами кортежей.
В приведенных ниже примерах можно использовать указанные переменные:
Все четыре из этих кортежей имеют одинаковое число полей (называемое арностью), а типы этих полей идентичны. Таким образом, все эти назначения работают:
Обратите внимание на то, что имена кортежей не назначаются. Значения полей назначаются в соответствии с порядком полей в кортеже.
Кортежи с разными числами полей не могут быть назначены:
Кортежи как возвращаемые значения методов
Метод может возвращать только одно значение. Однако часто требуется, чтобы вызов метода возвращал несколько значений. Существует несколько способов обойти это ограничение:
Можно создать пользовательский класс или структуру, свойства или поля которой представляют значения, возвращаемые методом. Таким решением является высокоплотное решение; для этого необходимо определить пользовательский тип, предназначенный только для извлечения значений из вызова метода.
Можно вернуть одно значение из метода и вернуть оставшиеся значения, передав их по ссылке к методу. Это включает дополнительные издержки при создании экземпляра переменной и риск непреднамеренной перезаписи значения переменной, которую вы передаете по ссылке.
Можно использовать кортеж, который предоставляет упрощенное решение для извлечения нескольких возвращаемых значений.
Мы можем вернуть кортеж из операции синтаксического анализа, если заключить вызов Int32.TryParse метода в собственный метод. В следующем примере NumericLibrary.ParseInteger вызывается Int32.TryParse метод и возвращается именованный кортеж с двумя элементами.
Затем можно вызвать метод с помощью следующего кода:
Свойства экземпляра кортежа доступны только для чтения; кортежи являются неизменяемыми. в Visual Basic кортежах и типах ValueTuple поля кортежей доступны для чтения и записи. кортежи являются изменяемыми.
Универсальные типы кортежей являются ссылочными типами. Использование этих типов кортежей означает выделение объектов. В критических путях это может заметно влиять на производительность приложения. Visual Basic кортежи и типы ValueTuple являются типами значений.
