Tuple-uri
Tuple-urile oferă un mod convenabil de a lucra cu un set de valori, adăugat în versiunea C# 7.0.
Un tuple reprezintă un set de valori încadrate între paranteze rotunde:
var tuple = (5, 10);
În acest caz, este definit un tuple tuple, care are două valori: 5 și 10. Ulterior, putem accesa fiecare dintre aceste valori prin câmpuri denumite:
Item[ordinal_number_of_field_in_tuple]
De exemplu:
var tuple = (5, 10);
Console.WriteLine(tuple.Item1); // 5
Console.WriteLine(tuple.Item2); // 10
tuple.Item1 += 26;
Console.WriteLine(tuple.Item1); // 31
În acest caz, tipul este determinat implicit. Dar putem specifica explicit tipul pentru variabila tuple:
(int, int) tuple = (5, 10);
Deoarece tuple-ul conține două numere, în definiția tipului trebuie să indicăm două tipuri numerice. Sau un alt exemplu de definire a unui tuple:
(string, int, double) person = ("Tom", 25, 81.23);
Primul element al tuple-ului reprezintă un șir de caractere, al doilea element - un tip int, iar al treilea - un tip double.
Putem, de asemenea, să dăm denumiri câmpurilor tuple-ului:
var tuple = (count: 5, sum: 10);
Console.WriteLine(tuple.count); // 5
Console.WriteLine(tuple.sum); // 10
Acum, pentru a accesa câmpurile tuple-ului, folosim denumirile acestora, și nu denumirile Item1 și Item2.
Putem chiar să decompozăm tuple-ul în variabile separate:
var (name, age) = ("Tom", 23);
Console.WriteLine(name); // Tom
Console.WriteLine(age); // 23
Una dintre problemele pe care tuple-urile le rezolvă elegant este schimbul de valori:
string main = "Java";
string second = "C#";
(main, second) = (second, main);
Console.WriteLine(main); // C#
Console.WriteLine(second); // Java
Aceasta poate fi utilizată, de exemplu, pentru sortarea simplă a unui array:
int[] nums = { 54, 7, -41, 2, 4, 2, 89, 33, -5, 12 };
// sortare
for (int i = 0; i < nums.Length - 1; i++)
{
for (int j = i + 1; j < nums.Length; j++)
{
if (nums[i] > nums[j])
(nums[i], nums[j]) = (nums[j], nums[i]);
}
}
// afișare
Console.WriteLine("Afișare array sortat");
for (int i = 0; i < nums.Length; i++)
{
Console.WriteLine(nums[i]);
}
Tuple ca rezultat al metodei
Tuple-urile pot fi utilizate ca rezultat al unei funcții. De exemplu, una dintre situațiile comune este returnarea dintr-o funcție a două sau mai multe valori, în timp ce funcția poate returna doar o singură valoare. Tuple-urile reprezintă o soluție optimă pentru această problemă:
var tuple = GetValues();
Console.WriteLine(tuple.Item1); // 1
Console.WriteLine(tuple.Item2); // 3
(int, int) GetValues()
{
var result = (1, 3);
return result;
}
Aici este definită metoda GetValues(), care returnează un tuple. Tuple-ul este definit ca un set de valori plasate între paranteze rotunde. În acest caz, returnăm un tuple din două elemente de tip int, adică două numere.
Un alt exemplu:
var tuple = GetValuesData(new int[] { 1, 2, 3, 4, 5, 6, 7 });
Console.WriteLine(tuple.count);
Console.WriteLine(tuple.sum);
(int sum, int count) GetValuesData(int[] numbers)
{
var result = (sum: 0, count: numbers.Length);
foreach (var n in numbers)
{
result.sum += n;
}
return result;
}
Tuple ca parametru al metodei
Tuple-urile pot fi de asemenea transmise ca parametru unei metode:
PrintPerson(("Tom", 37)); // Tom - 37
PrintPerson(("Bob", 41)); // Bob - 41
void PrintPerson((string name, int age) person)
{
Console.WriteLine($"{person.name} - {person.age}");
}
Aici, în metoda PrintPerson, este transmis un tuple din două elemente, primul dintre ele reprezentând un șir de caractere, iar al doilea - o valoare de tip int.