Comment initialiser une liste de Tuples?
J'aime les tuples. Ils vous permettent de regrouper rapidement les informations pertinentes, sans avoir à écrire une structure ou classe. Ceci est très utile lors de refactoring très localisée code.
De l'initialisation d'une liste d'entre eux semble toutefois un peu redondant.
var tupleList = new List<Tuple<int, string>>
{
Tuple.Create( 1, "cow" ),
Tuple.Create( 5, "chickens" ),
Tuple.Create( 1, "airplane" )
};
N'est-il pas une meilleure façon? J'aimerais une solution le long de la lignes de la Dictionnaire de l'initialiseur.
Dictionary<int, string> students = new Dictionary<int, string>()
{
{ 111, "bleh" },
{ 112, "bloeh" },
{ 113, "blah" }
};
Ne peut-on pas utiliser une syntaxe similaire?
- Dans ce cas, pourquoi ne pas utiliser un dictionnaire au lieu d'une liste de Tuples?
- S.: Un
Dictionary
n'autorise pas les doubles des clés. - À chaque fois c'est pas un deux-tuple où un élément est hashable/peut être commandé et unique.
- Bon point, n'a pas remarqué le double de la clé.
InformationsquelleAutor Steven Jeuris | 2011-11-03
Vous devez vous connecter pour publier un commentaire.
c# 7.0 vous permet de faire cela:
Si vous n'avez pas besoin d'un
List
, mais juste un tableau, vous pouvez le faire:Et si vous n'aimez pas "Élément1" et "Item2", vous pouvez le faire:
ou
qui vous permet de le faire:
tupleList[0].Index
ettupleList[0].Name
Cadre 4.6.2 ci-dessous et
Vous devez installer
System.ValueTuple
à partir du Gestionnaire de Package Nuget.Cadre de 4,7 et au-dessus de
Il est intégré dans le cadre. Ne pas installer
System.ValueTuple
. En fait, supprimer et le supprimer à partir du répertoire bin.remarque: Dans la vraie vie, je ne serais pas capable de choisir entre de vache, des poules ou en avion. Je serais vraiment déchiré.
System.ValueTuple
prend en charge les core 2.0. Mais, à essayer sans le Nuget tout d'abord, comme des paquets inutiles peuvent causer des problèmes. D'une manière ou d'une autre, oui. Utilisation de c# v7 ou plus si possible.Oui! C'est possible.
Cela vous permet d'effectuer les opérations suivantes:
groceryList[0] == groceryList[1]
ou fait une comparaison doivent être mises en œuvre?C# 6 ajoute une nouvelle fonctionnalité pour cette: extension d'Ajouter des méthodes. Cela a toujours été possible pour VB.net mais il est maintenant disponible en C#.
Maintenant, vous n'avez pas à ajouter
Add()
méthodes des classes directement, vous pouvez les mettre en œuvre que les méthodes d'extension. Lors de l'extension de toute énumérable type avec unAdd()
méthode, vous serez capable de l'utiliser dans la collecte de l'initialiseur d'expressions. Si vous n'avez pas à dériver à partir des listes explicitement plus (comme mentionné dans une autre réponse), vous pouvez simplement l'étendre.Cela vous permettra de faire sur n'importe quel classe qui implémente
IList<>
:Bien sûr, vous n'êtes pas limité à l'extension des collections de tuples, il peut être pour les collections de tout type spécifique que vous souhaitez la syntaxe spéciale pour.
C# 7 sera l'ajout du support pour les tuples construit dans la langue, bien qu'ils soient d'un type différent (
System.ValueTuple
à la place). Donc, il serait bon d'ajouter des surcharges pour une valeur de n-uplets de sorte que vous avez la possibilité de les utiliser ainsi. Malheureusement, il n'existe pas de conversion implicite entre les deux.Cette façon, la liste d'initialisation sera d'autant plus agréable.
Mais au lieu de passer par toutes ces difficultés, c'est peut-être mieux de passer à l'utilisation
ValueTuple
exclusivement.TupleList<int, string>.
pour être 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 est un peu mieux
Tuple.Create
au lieu et vous pouvez déduire le type d'argumentsVieille question, mais c'est ce que je faire pour rendre les choses un peu plus lisible:
Super Duper Vieux je sais mais je voudrais ajouter ma pièce sur l'utilisation de Linq et la poursuite des lambdas sur les méthodes avec l'aide de C# 7. J'essaie d'utiliser uplets nommé en remplacement de Otd et anonyme projections lors de réutilisés dans une classe. Oui pour les moqueries et les tests que vous avez toujours besoin les classes, mais de faire des choses en ligne et de passer dans une classe est agréable d'avoir cette nouvelle option à mon humble avis. Vous pouvez instancier à partir de
Une technique je pense, est un peu plus facile et qui n'a pas été mentionné avant ici:
Je pense que c'est un peu plus propre que:
var
ou pas. Personnellement, je préfère explicite de frappe (quand il n'est pas dupliqué dans, par exemple, le constructeur).Pourquoi faire comme les tuples? C'est comme les types anonymes: pas de noms. Ne peut pas comprendre la structure de données.
J'aime les classiques classes