Eu amo tuplas . Eles permitem que você agrupe rapidamente informações relevantes sem precisar escrever uma estrutura ou classe para elas. Isso é muito útil ao refatorar um código muito localizado.
Inicializar uma lista deles, no entanto, parece um pouco redundante.
var tupleList = new List<Tuple<int, string>>
{
Tuple.Create( 1, "cow" ),
Tuple.Create( 5, "chickens" ),
Tuple.Create( 1, "airplane" )
};
Não existe uma maneira melhor? Eu adoraria uma solução ao longo das linhas do inicializador de dicionário .
Dictionary<int, string> students = new Dictionary<int, string>()
{
{ 111, "bleh" },
{ 112, "bloeh" },
{ 113, "blah" }
};
Não podemos usar uma sintaxe semelhante?
Dictionary
não permite chaves duplicadas.Respostas:
O c # 7.0 permite fazer isso:
Se você não precisa de um
List
, mas apenas de um array, pode fazer:E se você não gosta de "Item1" e "Item2", pode:
ou para uma matriz:
o que permite:
tupleList[0].Index
etupleList[0].Name
Estrutura 4.6.2 e abaixo
Você deve instalar a
System.ValueTuple
partir do Nuget Package Manager.Quadro 4.7 e superior
Está embutido na estrutura. Você não instalar
System.ValueTuple
. Na verdade, remova-o e exclua-o do diretório bin.nota: na vida real, eu não seria capaz de escolher entre vacas, galinhas ou avião. Eu ficaria muito rasgado.
fonte
System.ValueTuple
suporta o núcleo 2.0. Mas, tente primeiro sem o Nuget, pois pacotes desnecessários podem causar problemas. Então, de um jeito ou de outro, sim. Use c # v7 ou superior, se possível.Sim! Isso é possível .
Isso permite que você faça o seguinte:
fonte
groceryList[0] == groceryList[1]
ou é necessário implementar uma comparação?O C # 6 adiciona um novo recurso apenas para isso: extension Adicione métodos. Isso sempre foi possível para o VB.net, mas agora está disponível em C #.
Agora você não precisa adicionar
Add()
métodos diretamente às suas classes, pode implementá-los como métodos de extensão. Ao estender qualquer tipo enumerável com umAdd()
método, você poderá usá-lo nas expressões do inicializador de coleção. Para que você não precise mais derivar explicitamente das listas ( como mencionado em outra resposta ), basta estendê-las.Isso permitirá que você faça isso em qualquer classe que implemente
IList<>
:É claro que você não está restrito a estender coleções de tuplas, pode ser para coleções de qualquer tipo específico para o qual você deseja a sintaxe especial.
O C # 7 adicionará suporte para tuplas criadas no idioma, embora elas sejam de um tipo diferente (em
System.ValueTuple
vez disso). Portanto, seria bom adicionar sobrecargas para tuplas de valor, assim você tem a opção de usá-las também. Infelizmente, não há conversões implícitas definidas entre os dois.Dessa forma, a inicialização da lista ficará ainda melhor.
Mas, em vez de passar por todo esse problema, pode ser melhor mudar para o uso
ValueTuple
exclusivo.fonte
TupleList<int, string>.
que é mais legível do queList<Tuple<int, string>>
.using TupleList = System.Collections.Generic.List<System.Tuple<int, string>>;
Você pode fazer isso chamando o construtor toda vez que é um pouco melhor
fonte
Tuple.Create
em vez e você pode inferir os argumentos de tipoPergunta antiga, mas é o que normalmente faço para tornar as coisas um pouco mais legíveis:
fonte
Super Duper Old Eu sei, mas acrescentaria meu artigo sobre o Linq e lambdas de continuação em métodos com o C # 7. Tento usar tuplas nomeadas como substitutas de DTOs e projeções anônimas quando reutilizadas em uma classe. Sim, para zombar e testar, você ainda precisa de aulas, mas fazer coisas em linha e distribuir uma aula é bom ter essa nova opção IMHO. Você pode instancia-los de
fonte
Por que gosta de tuplas? É como tipos anônimos: sem nomes. Não consigo entender a estrutura dos dados.
Eu gosto de aulas clássicas
fonte
Uma técnica que eu acho que é um pouco mais fácil e que não foi mencionada antes aqui:
Eu acho que é um pouco mais limpo do que:
fonte
var
ou não. Pessoalmente, prefiro digitar explicitamente (quando não é duplicado, por exemplo, no construtor).fonte