English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tuple (Tuple) do C#

C# Orientado a Objetos (OOP)4A classe Tuple<T> é introduzida no .NET Framework

.0 introduzida. A tupla é uma estrutura de dados que contém uma sequência de elementos de diferentes tipos de dados. Ela pode ser usada em situações onde é necessário uma estrutura de dados para salvar objetos com atributos, mas não se deseja criar um tipo separado para eles.

Sintaxe:1Tuple<T2Tuple<T3Tuple<T4Tuple<T5Tuple<T6Tuple<T7, T

, TRest>

Tuple<int, string, string> pessoa = new Tuple<int, string, string>(1, "Steve", "Jobs");

No exemplo acima, criamos uma tupla contendo uma instância de registro de pessoa. Nós especificamos um tipo para cada elemento e passamos os valores para o construtor. Especificar o tipo de cada elemento pode ser complicado. O C# introduziu uma classe auxiliar estática Tupla, que retorna uma instância de Tuple <T> sem a necessidade de especificar o tipo de cada elemento, conforme mostrado a seguir.

var pessoa = Tupla.Criar(1, "Steve", "Jobs");

Um tupla pode conter no máximo oito elementos. Quando tentar incluir mais de oito elementos, será gerado um erro de compilação.

var numbers = Tuple.Create(1, 2, 3, 4, 5, 6, 7, 8);

Acesso a elementos de tupla

Os elementos da tupla podem ser acessados através do atributo Item < númerodoelemento >, por exemplo Item1、 Item2、 Item3etc., pode-se acessar Item7atributo. Item1atributo retorna o primeiro elemento, Item2retorna o segundo elemento, e assim por diante. O último elemento (o8um elemento) será retornado usando o atributo Rest.

var pessoa = Tupla.Criar(1, "Steve", "Jobs");
pessoa.Item1; // Retorno 1
pessoa.Item2; // retorna "Steve"
pessoa.Item3; // retorna "Jobs"
var números = Tupla.Criar("One", 2, 3, "Four", 5, "Six", 7, 8);
numbers.Item1; // Retorno "One"
numbers.Item2; // Retorno 2
numbers.Item3; // Retorno 3
numbers.Item4; // Retorno "Four"
numbers.Item5; // Retorno 5
numbers.Item6; // Retorno "Six"
numbers.Item7; // Retorno 7
numbers.Rest; // Retorno (8)
numbers.Rest.Item1; // Retorno 8

Normalmente, a8posições para tuplas aninhadas, você pode usar a propriedade Rest para acessar essa posição.

Tuplas aninhadas

Se você desejar incluir oito ou mais elementos em uma tupla, você pode fazer isso aninhando outro objeto de tupla como o oitavo elemento. Você pode acessar a última tupla aninhada usando a propriedade Rest. Para acessar os elementos da tupla aninhada, use Rest.Item1.Item<elementNumber> propriedade.

var numbers = Tuple.Create(1, 2, 3, 4, 5, 6, 7, Tuple.Create(8, 9, 10, 11, 12, 13))
numbers.Item1; // Retorno 1
numbers.Item7; // Retorno 7
numbers.Rest.Item1; //Retorno (8,9,10,11,12,13)
numbers.Rest.Item1.Item1; //Retorno 8
numbers.Rest.Item1.Item2; //Retorno 9

Você pode incluir objetos de tuplas aninhadas em qualquer posição da sequência. No entanto, é recomendável colocar tuplas aninhadas no final da sequência para que possam ser acessadas usando a propriedade Rest.

var numbers = Tuple.Create(1, 2, Tuple.Create(3, 4, 5, 6, 7,  8), 9, 10, 11, 12, 13 );
numbers.Item1; // Retorno 1
numbers.Item2; // Retorno 2
numbers.Item3; // Retorno (3, 4, 5, 6, 7,  8)
numbers.Item3.Item1; // Retorno 3
numbers.Item4; // Retorno 9
numbers.Rest.Item1; //Retorno13

Os tuplas como parâmetros de método

Os métodos podem passar tuplas como parâmetros.

static void Main(string[] args)
{	var person = Tuple.Create(1, "Steve", "Jobs");
    DisplayTuple(person);
}
static void DisplayTuple(Tuple<int,string,string> person)
{
    Console.WriteLine($"Id = { person.Item1});
    Console.WriteLine($"First Name = { person.Item2});
    Console.WriteLine($"Last Name = { person.Item3});
}

Os tuplas como tipo de retorno

Os tuplas podem ser retornadas de métodos.

static void Main(string[] args)
{	var person = GetPerson();
}
static Tuple<int, string, string> GetPerson() 
{	return Tuple.Create(1, "Bill", "Gates");
}

Uso das tuplas

Os tuplas podem ser usadas nas seguintes situações:

  1. Quando você deseja retornar vários valores de um método sem usar os parâmetros ref ou out...

  2. Quando você deseja passar vários valores para um método através de um único parâmetro...

  3. Quando você deseja salvar temporariamente registros de banco de dados ou alguns valores sem criar uma classe separada...

Desvantagens do Tuple:

  1. O Tuple é um tipo de referência, não um tipo de valor. Ele é alocado na pilha e pode causar operações intensivas em CPU.

  2. O Tuple é limitado a oito elementos. Se precisar armazenar mais elementos, é necessário usar tuplas aninhadas. No entanto, isso pode causar ambiguidades.

  3. Os elementos do Tuple podem ser acessados usando o padrão de nome Item <elementNumber>, o que não é muito razoável.

C#7Foi introduzido o ValueTuple para superar as limitações do Tuple e tornar o uso do Tuple mais fácil. Conheça-o no próximo capítulo.