Existe uma maneira de usar uma classe Tuple, mas forneça os nomes dos itens nela?
Por exemplo:
public Tuple<int, int, int int> GetOrderRelatedIds()
Isso retorna os IDs para OrderGroupId, OrderTypeId, OrderSubTypeId e OrderRequirementId.
Seria bom informar aos usuários do meu método qual é qual. (Quando você chama o método, os resultados são result.Item1, result.Item2, result.Item3, result.Item4. Não está claro qual é qual.)
(Eu sei que eu poderia criar uma classe para armazenar todos esses IDs, mas esses IDs já têm suas próprias classes em que vivem e criar uma classe para o valor de retorno desse método parece bobo.)
Tuple
é muito genérico, então isso é tudo que você começaRespostas:
No C # 7.0 (Visual Studio 2017), há uma nova construção para fazer isso:
fonte
List<(int first, int second)>
. Eu tive que baixar o pacote System.ValueTuple de NuGet para obtê-lo para trabalhar no Visual Studio 2017.return (first: first, middle: middle, last: last);
return (first, middle, last);
no .NET 4.7.1 (não tenho certeza para o 4.7.0) #ValueTuple
, embora geralmente ótimos, são um tipo de valor mutável (struct), enquantoTuple
é um tipo de referência imutável (classe). Tanto quanto eu sei, não há como obter um tipo de referênciaTuple
com nomes de itens amigáveis.Até o C # 7.0, não havia como fazer isso sem definir seu próprio tipo.
fonte
Aqui está uma versão muito complicada do que você está perguntando:
Por que não apenas fazer uma aula?
fonte
Tuple<T, T2>
não pode ser uma estrutura.Com o .net 4, talvez você possa olhar para
ExpandoObject
, no entanto, não o usar neste caso simples, pois o que seriam erros em tempo de compilação se tornam erros em tempo de execução.Outra coisa que vale a pena mencionar é um tipo anônimo dentro de um método , mas você precisa criar uma classe se quiser devolvê-la.
fonte
Reproduzindo minha resposta deste post, pois é um ajuste melhor aqui.
Começando C # v7.0, agora é possível nomear as propriedades tupla que anteriormente usados para padrão para nomes predefinidos como
Item1
,Item2
e assim por diante.Nomeando as propriedades de literais de tupla :
A saída no console:
Retornando tupla (tendo nomeado propriedades) de um método :
A saída no console:
Criando uma lista de Tuplas com propriedades nomeadas
Saída no console:
Espero ter coberto tudo. No caso, há algo que eu perdi, por favor, me dê um feedback nos comentários.
Nota : Meus trechos de código estão usando o recurso de interpolação de string do C # v7, conforme detalhado aqui .
fonte
MichaelMocko Respondido é ótimo,
mas quero acrescentar algumas coisas que tive que descobrir
A linha acima fornecerá um erro de tempo de compilação se você estiver usando o .net framework <4.7
Portanto, se você tiver um projeto que esteja usando a estrutura .net <4.7 e ainda desejar usar o ValueTuple do que o workAround, estaria instalando este pacote de nuget
fonte
Não, você não pode nomear os membros da tupla.
O meio seria usar ExpandoObject em vez de Tuple.
fonte
Se os tipos de itens são todos diferentes, aqui está uma aula que fiz para obtê-los de forma mais intuitiva.
O uso desta classe:
Código fonte:
fonte
Isso é muito chato e espero que versões futuras do C # atendam a essa necessidade. Acho que a solução mais fácil é usar um tipo diferente de estrutura de dados ou renomear os "itens" para sua sanidade e para a sanidade de outras pessoas que leem seu código.
fonte
Eu acho que criaria uma classe, mas outra alternativa são os parâmetros de saída.
Como sua tupla contém apenas números inteiros, você pode representá-la com um
Dictionary<string,int>
mas também não recomendo.
fonte
Por que todo mundo está tornando a vida tão difícil? As tuplas são para processamento de dados temporário . Trabalhar com tuplas o tempo todo tornará o código muito difícil de entender em algum momento. Criando classes para tudo pode eventualmente inchar seu projeto.
É sobre equilíbrio, no entanto ...
Seu problema parece ser algo para o qual você deseja uma aula. E apenas por uma questão de integridade, esta classe abaixo também contém construtores.
Esse é o padrão adequado para
Ou, se você quiser realmente simples: Você também pode usar inicializadores de tipo:
fonte
Eu escreveria os nomes dos itens no summay .. então, passando o mouse sobre a função helloworld (), o texto dirá hello = Item1 e world = Item2
fonte
Só para adicionar à resposta @MichaelMocko. As tuplas têm algumas dicas no momento:
Você não pode usá-los em árvores de expressão EF
Exemplo:
Não será possível compilar com o erro "Uma árvore de expressão pode não conter uma tupla literal". Infelizmente, a API das árvores de expressão não foi expandida com suporte para tuplas quando elas foram adicionadas ao idioma.
Acompanhe (e vote novamente) este problema para as atualizações: https://github.com/dotnet/roslyn/issues/12897
Para contornar o problema, você pode convertê-lo em tipo anônimo primeiro e depois converter o valor em tupla:
Outra opção é usar ValueTuple.Create:
Referências:
https://www.damirscorner.com/blog/posts/20181207-NoSupportForTuplesInExpressionTrees.html
Converter tipo anônimo em novo tipo de tupla C # 7
Você não pode desconstruí-los em lambdas
Há uma proposta para adicionar o suporte: https://github.com/dotnet/csharplang/issues/258
Exemplo:
Referências:
Eles não serializam bem
Os nomes dos campos de tupla estão disponíveis apenas em tempo de compilação e são completamente eliminados em tempo de execução.
Referências:
fonte
Você pode escrever uma classe que contém a tupla.
Você precisa substituir as funções Equals e GetHashCode
e os operadores == e! =.
retornará:
Verdade
Verdade
fonte
Exemplo de tupla C # 7
fonte