Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Кортежи появились в C# начиная с версии 7.0 с целью обеспечения работы с наборами значений. Основное предназначение кортежей - обобщение нескольких элементов в структуру с упрощенным синтаксисом. Для использования кортежей необходим тип System.ValueTuple. Для использования кортежей в более ранних версиях .NET Framework в проект необходимо добавить NuGet пакет SystemValueTuple.
Основные свойства кортежей:
кортежи определяются с неограниченным количеством элементов.
Кортежи являются типом значений.
Кортежи поддерживают операторы = и !=
Значения кортежей являются общедоступными полями.
var tuple1 = (10, 23.4); //Определен кортеж tuple1 с двумя значениями 10 и 23.4
Обращение к значениям кортежа происходит через поля с названиями типа Item[номер], где номер - порядковый номер значения в кортеже. Рассмотрим на примере программы:
static void Main(string[] args)
{
int tuple1 = (11, 33); //Определение кортежа с целочисленными значениями
Console.WriteLine(tuple1.Item1); //Вывод на консоль 11
tuple1.Item2 *= 2; //Умножение второго значения на 2
}
Возможно определение типа для каждого из значений. Для этого перед именем кортежа в скобках указываются типы для каждого значения.
(string, int) tuple = ("Coin", 25);
Для каждого значения кортежа предусмотрена возможность индивидуального именования. Заданное имя элемента называется именем кандидата. Оно является дубликатором другого явного или неявного имени поля кортежа.
var tuple1 = (purchase:5, sale:10);
Console.WriteLine(tuple1.purchase);
Для определения кортежей можно применять переменные, с которыми в дальнейшем можно производить операции.
var (purchase, sale) = (5, 10);
Console.WriteLine(Purchase);
Применение кортежей
Кортежи могут передаваться в метод в качестве параметров и служить возвращаемым результатом. В частности, очень удобно возвращать кортеж в качестве результата в том случае, если метод возвращает только одно значение.
static void Main(string[] args)
{
var tuple1 = Method(); //Присваиваем кортежу tuple1 возвращаемое значение
Console.WriteLine(tuple1.Item1);
Console.WriteLine(tuple1.Item2);
}
private static (int, int) Method() //Метод, возвращающий кортеж
{
var res = (5, 10);
return res;
}
В следующем примере кортеж передается в метод в качестве параметра.
static void Main(string[] args)
{
var (purchase, sale) = Method ((5, 10), 3);
Console.WriteLine($"Purchase: {purchase} Sale: {sale}");
}
private static (int purchase, int sale) Method((int p, int s)tuple, int n)
{
var res = (purchase: tuple.p, sale: tuple.s + n);
return result;
}
Присваивание кортежей
В кортежах предусмотрена возможность присваивания. Для этого оба кортежа должны иметь одинаковое количество элементов, типы соответствующих значений должны совпадать или иметь возможность неявного приведения друг к другу. Значения присваиваются в порядке их расположения. При присвоении имена полей не учитываются.
(int, int) tuple1 = (22, 12);
(double A, double B) tuple2 = (2.15, 3,02);
tuple2 = tuple1;
Деконструкция кортежей
Деконструкцией кортежей называется операция присваивания экземпляра кортежа в отдельные переменные.
var tuple = ("Alex", 36);
(string name, int age) = tuple;
//или
string name;
int age;
(name, age) = tuple;
Проверка кортежей на равенство
var tuple1 = (23, 36);
var tuple2 = (17, 31);
Console.WriteLine(tuple1 == tuple2);
Console.WriteLine(tuple1 != tuple2);
Имена полей кортежей при сравнении не учитываются.
Условия возможности сравнения кортежей:
Оба кортежа содержат одинаковое количество элементов.
Элементы должны соответствовать возможности сравнения.
Кортежи в качестве параметров вывода
При выполнении рефакторинга метода, имеющего параметры out они могут иметь тип кортежа.
var limitsLookup = new Dictionary<int, (int Min, int Max)>()
{
[2] = (4, 10),
[4] = (10, 20),
[6] = (0, 23)
};
if (limitsLookup.TryGetValue(4, out (int Min, int Max) limits))
{
Console.WriteLine($"Found limits: min is {limits.Min}, max is {limits.Max}");
}
Различия между типами кортежей System.ValueTuple и SystemTuple
Основные различия заключаются в следующем:
Типы ValueTuple являются типами значений - типы Tuple - ссылочные типы.
Типы ValueTuple являются изменяемыми типами - типы Tuple - неизменяемые.
Значениями типов ValueTuple являются поля. Значениями типов Tuple являются свойства.
Список использованных источников:
https://metanit.com/sharp/tutorial/2.19.php
https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/builtin-types/value-tuples
https://coderoad.ru/11146966/c-%D0%9A%D0%BE%D1%80%D1%82%D0%B5%D0%B6-%D0%BA%D0%B0%D0%BA%D0%BE%D0%B2%D0%BE-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5-%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B0