J'adore les tuples . Ils vous permettent de regrouper rapidement les informations pertinentes sans avoir à écrire une structure ou une classe pour cela. Ceci est très utile lors de la refactorisation de code très localisé.
L'initialisation d'une liste semble cependant un peu redondante.
var tupleList = new List<Tuple<int, string>>
{
Tuple.Create( 1, "cow" ),
Tuple.Create( 5, "chickens" ),
Tuple.Create( 1, "airplane" )
};
N'y a-t-il pas une meilleure façon? J'adorerais une solution sur le modèle de l' initialiseur de dictionnaire .
Dictionary<int, string> students = new Dictionary<int, string>()
{
{ 111, "bleh" },
{ 112, "bloeh" },
{ 113, "blah" }
};
Ne pouvons-nous pas utiliser une syntaxe similaire?
Dictionary
n'autorise pas les clés en double.Réponses:
c # 7.0 vous permet de faire ceci:
Si vous n'avez pas besoin d'un
List
, mais simplement d'un tableau, vous pouvez faire:Et si vous n'aimez pas "Item1" et "Item2", vous pouvez faire:
ou pour un tableau:
qui vous permet de faire:
tupleList[0].Index
ettupleList[0].Name
Framework 4.6.2 et inférieur
Vous devez installer à
System.ValueTuple
partir du gestionnaire de packages Nuget.Framework 4.7 et supérieur
Il est intégré dans le cadre. Ne pas installer
System.ValueTuple
. En fait, supprimez-le et supprimez-le du répertoire bin.note: dans la vraie vie, je ne pourrais pas choisir entre vache, poulets ou avion. Je serais vraiment déchiré.
la source
System.ValueTuple
prend en charge le noyau 2.0. Mais essayez-le sans Nuget d'abord, car les packages inutiles peuvent causer des problèmes. Donc, d'une manière ou d'une autre, oui. Utilisez c # v7 ou supérieur si possible.Oui! C'est possible .
Cela vous permet d'effectuer les opérations suivantes:
la source
groceryList[0] == groceryList[1]
-t-il ou faut-il effectuer une comparaison?C # 6 ajoute une nouvelle fonctionnalité juste pour cela: extension Ajouter des méthodes. Cela a toujours été possible pour VB.net mais est maintenant disponible en C #.
Maintenant, vous n'avez plus besoin d'ajouter
Add()
directement des méthodes à vos classes, vous pouvez les implémenter en tant que méthodes d'extension. Lorsque vous étendez un type énumérable avec uneAdd()
méthode, vous pourrez l'utiliser dans des expressions d'initialisation de collection. Vous n'avez donc plus besoin de dériver de listes explicitement ( comme mentionné dans une autre réponse ), vous pouvez simplement l'étendre.Cela vous permettra de le faire sur n'importe quelle classe qui implémente
IList<>
:Bien sûr, vous n'êtes pas limité à l'extension des collections de tuples, cela peut être pour les collections de tout type spécifique pour lequel vous voulez la syntaxe spéciale.
C # 7 ajoutera le support des tuples intégrés dans le langage, bien qu'ils soient d'un type différent (à la
System.ValueTuple
place). Il serait donc bon d'ajouter des surcharges pour les tuples de valeur afin que vous ayez la possibilité de les utiliser également. Malheureusement, aucune conversion implicite n'est définie entre les deux.De cette façon, l'initialisation de la liste sera encore plus agréable.
Mais au lieu de passer par tous ces problèmes, il serait peut-être préférable de passer à l'utilisation
ValueTuple
exclusive.la source
TupleList<int, string>.
qu'elle est plus lisible queList<Tuple<int, string>>
.using TupleList = System.Collections.Generic.List<System.Tuple<int, string>>;
Vous pouvez le faire en appelant le constructeur à chaque fois avec est légèrement meilleur
la source
Tuple.Create
place et vous pouvez déduire les arguments de typeVieille question, mais c'est ce que je fais généralement pour rendre les choses un peu plus lisibles:
la source
Super Duper Old, je sais, mais j'ajouterais mon article sur l'utilisation de Linq et les lambdas de continuation sur les méthodes utilisant C # 7. J'essaie d'utiliser des tuples nommés en remplacement des DTO et des projections anonymes lorsqu'ils sont réutilisés dans une classe. Oui pour se moquer et tester, vous avez toujours besoin de classes, mais faire les choses en ligne et passer dans une classe est bien d'avoir cette nouvelle option à mon humble avis. Vous pouvez les instancier à partir de
la source
Pourquoi aimez-vous les tuples? C'est comme des types anonymes: pas de noms. Impossible de comprendre la structure des données.
J'aime les cours classiques
la source
Une technique que je pense est un peu plus facile et qui n'a pas été mentionnée avant ici:
Je pense que c'est un peu plus propre que:
la source
var
ou non. Personnellement, je préfère la frappe explicite (lorsqu'elle n'est pas dupliquée, par exemple dans le constructeur).la source