Интересные Вещи, Которые Можно Делать с Кортежами
Сегодня рассмотрим, что такое кортежи и некоторые вещи, которые можно сделать с ними.
Кортежи (ValueTuple) в C# — это упрощённый изменяемый тип-значение, который позволяет группировать несколько значений или связанных данных вместе для различных целей, таких как возврат нескольких значений из метода, создание структурированных данных и т.п. Он обеспечивает более высокую производительность по сравнению с традиционными ссылочными типами, поскольку не требует аллокации на куче.
(string Name, int Age) person = ("Jon Smith", 42);
person.Name; // "Jon Smith"
person.Age; // 42
static (string Name, int Age) GetPerson()
=> ("Jon Smith", 42);
Что же можно делать с помощью кортежей?1. Поменять местами два значения
Допустим, мы хотим поменять местами значения двух переменных:
int a = 1;2. Простая реализация IEquatable
int b = 2;
// Замена
(a, b) = (b, a);
А также простой способ сравнения двух объектов или получения хэш-кода:
public class Dimension : IEquatable<Dimension>3. Сопоставление по шаблону
{
public Dimension(int width, int height)
=> (Width, Height) = (width, height);
public int Width { get; }
public int Height { get; }
public bool Equals(Dimension d)
=> (Width, Height) == (d?.Width, d?.Height);
public override bool Equals(object o)
=> o is Dimension d && Equals(d);
public override int GetHashCode()
=> (Width, Height).GetHashCode();
}
Кортежи позволяют писать элегантный и выразительный код:
(string Name, int Age) person = ("Alice", 25);
string desc = person switch
{
("Alice", >= 0 and < 13) => "Alice ребёнок.",
("Alice", >= 13 and < 20) => "Alice подросток.",
("Alice", _) => "Alice взрослая.",
(_, >= 0 and < 13) => "Это ребёнок.",
(_, >= 13 and < 20) => "Это подросток.",
_ => "Это взрослый."
};
4. Деконструкция пользовательских типовКортежи позволяют легко разбить тип на отдельные переменные:
public class StudentСм. подробнее о деконструкции
{
public string Name { get; set; }
public int Age { get; set; }
public void Deconstruct(out string name, out int age)
{
name = Name;
age = Age;
}
}
var student = new Student { Name = "John", Age = 21 };
var (studentName, studentAge) = student;
Источник: https://steven-giesel.com/blogPost/bcbb602f-4080-4e89-9929-019bb4e1cb58