MySQL Java JavaScript PHP Python HTML-CSS C-sharp

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.

← Lecția anterioară Lecția următoare →