Existe-t-il un moyen d'utiliser une classe Tuple, mais de fournir les noms des éléments qu'elle contient?
Par exemple:
public Tuple<int, int, int int> GetOrderRelatedIds()
Cela renvoie les identifiants de OrderGroupId, OrderTypeId, OrderSubTypeId et OrderRequirementId.
Ce serait bien de faire savoir aux utilisateurs de ma méthode laquelle est laquelle. (Lorsque vous appelez la méthode, les résultats sont result.Item1, result.Item2, result.Item3, result.Item4. On ne sait pas lequel est lequel.)
(Je sais que je pourrais simplement créer une classe pour contenir tous ces identifiants, mais si ces identifiants ont déjà leurs propres classes dans lesquelles ils vivent et créer une classe pour la valeur de retour de cette méthode semble idiot.)
Tuple
est très générique, c'est donc tout ce que vous obtenezRéponses:
Dans C # 7.0 (Visual Studio 2017), il existe une nouvelle construction pour le faire:
la source
List<(int first, int second)>
. J'ai dû télécharger le package System.ValueTuple de NuGet pour le faire fonctionner dans Visual Studio 2017.return (first: first, middle: middle, last: last);
return (first, middle, last);
dans .NET 4.7.1 (pas sûr pour 4.7.0)ValueTuple
, bien que généralement excellents, sont un type de valeur mutable (struct), tandisTuple
qu'un type de référence immuable (classe). Pour autant que je sache, il n'y a aucun moyen d'obtenir un type de référenceTuple
avec des noms d'élément conviviaux.Jusqu'à C # 7.0, il n'y avait aucun moyen de faire cela sans définir votre propre type.
la source
Voici une version trop compliquée de ce que vous demandez:
Pourquoi ne pas simplement faire un cours?
la source
Tuple<T, T2>
vous ne pouvez pas être une structure.Avec .net 4, vous pourriez peut-être regarder le
ExpandoObject
, cependant, ne l'utilisez pas pour ce cas simple car ce qui aurait été des erreurs de compilation deviendrait des erreurs d'exécution.Quelque chose d'autre mérite d'être mentionné est un type anonyme pour une méthode , mais vous devez créer une classe si vous souhaitez la renvoyer.
la source
Reproduire ma réponse à partir de cela post car elle est mieux adaptée ici.
À partir de C # v7.0, il est désormais possible de nommer les propriétés de tuple qui, auparavant, utilisaient par défaut des noms prédéfinis comme
Item1
,Item2
etc.Nommer les propriétés des Tuple Literals :
La sortie sur console:
Retour de Tuple (ayant des propriétés nommées) à partir d'une méthode :
La sortie sur console:
Création d'une liste de tuples ayant des propriétés nommées
Sortie sur console:
J'espère avoir tout couvert. Dans le cas où il y a quelque chose que j'ai manqué, merci de me faire part de vos commentaires.
Remarque : Mes extraits de code utilisent la fonction d'interpolation de chaînes de C # v7, comme détaillé ici .
la source
MichaelMocko Answered est super,
mais je veux ajouter quelques choses que je devais comprendre
la ligne ci-dessus vous donnera une erreur de temps de compilation si vous utilisez le framework .net <4.7
Donc, si vous avez un projet qui utilise le framework .net <4.7 et que vous souhaitez toujours utiliser ValueTuple, workAround installerait ce package de nuget
la source
Non, vous ne pouvez pas nommer les membres du tuple.
L' intermédiaire serait d'utiliser ExpandoObject au lieu de Tuple .
la source
Si les types de vos articles sont tous différents, voici un cours que j'ai fait pour les obtenir de manière plus intuitive.
L'utilisation de cette classe:
Code source:
la source
C'est très ennuyeux et je m'attends à ce que les futures versions de C # répondent à ce besoin. Je trouve que le travail le plus simple consiste à utiliser un type de structure de données différent ou à renommer les «éléments» pour votre raison et pour la raison des autres qui lisent votre code.
la source
Je pense que je créerais une classe mais une autre alternative est les paramètres de sortie.
Étant donné que votre tuple ne contient que des entiers, vous pouvez le représenter avec un
Dictionary<string,int>
mais je ne le recommande pas non plus.
la source
Pourquoi tout le monde rend la vie si difficile. Les tuples sont destinés à un traitement des données plutôt temporaire . Travailler avec Tuples tout le temps rendra le code très difficile à comprendre à un moment donné. Créer des cours pour tout pourrait éventuellement gonfler votre projet.
Il s'agit cependant d'équilibre ...
Votre problème semble être quelque chose pour lequel vous voudriez un cours. Et juste pour être complet, cette classe ci-dessous contient également des constructeurs.
Ceci est le modèle approprié pour
Ou, si vous voulez que ce soit très simple: vous pouvez également utiliser des initialiseurs de type:
la source
J'écrirais les noms des éléments dans le résumé .. donc en survolant la fonction helloworld (), le texte dira bonjour = élément1 et monde = élément2
la source
Juste pour ajouter à la réponse @MichaelMocko. Les tuples ont quelques accrochages en ce moment:
Vous ne pouvez pas les utiliser dans les arbres d'expression EF
Exemple:
Cela ne parviendra pas à compiler avec l'erreur «Une arborescence d'expression peut ne pas contenir de littéral de tuple». Malheureusement, l'API des arborescences d'expression n'a pas été étendue avec la prise en charge des tuples lorsque ceux-ci ont été ajoutés au langage.
Suivez (et votez) ce problème pour les mises à jour: https://github.com/dotnet/roslyn/issues/12897
Pour contourner le problème, vous pouvez d'abord le convertir en type anonyme, puis convertir la valeur en tuple:
Une autre option consiste à utiliser ValueTuple.Create:
Références:
https://www.damirscorner.com/blog/posts/20181207-NoSupportForTuplesInExpressionTrees.html
Convertir un type anonyme en un nouveau type de tuple C # 7
Vous ne pouvez pas les déconstruire à Lambdas
Il y a une proposition pour ajouter le support: https://github.com/dotnet/csharplang/issues/258
Exemple:
Références:
Ils ne sérialiseront pas bien
Les noms de champ de tuple ne sont disponibles qu'au moment de la compilation et sont complètement effacés lors de l'exécution.
Références:
la source
Vous pouvez écrire une classe qui contient le tuple.
Vous devez remplacer les fonctions Equals et GetHashCode
et les opérateurs == et! =.
retournera:
Vrai
Vrai
la source
Exemple de tuple C # 7
la source