306 votes

Meilleur nommage dans les classes Tuple que "Item1", "Item2".

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.

Il serait bon que les utilisateurs de ma méthode sachent ce qu'il en est. (Lorsque vous appelez la méthode, les résultats sont result.Item1, result.Item2, result.Item3, result.Item4. Il n'est pas clair de savoir lequel est lequel).

(Je sais que je pourrais simplement créer une classe pour contenir tous ces Ids, mais ces Ids ont déjà leurs propres classes dans lesquelles ils vivent et faire une classe pour la valeur de retour de cette seule méthode semble idiot).

441voto

MichaelMocko Points 3988

Dans C# 7.0 (Visual Studio 2017), il existe une nouvelle construction permettant de le faire :

(string first, string middle, string last) LookupName(long id)

49voto

Mark Points 7136

Jusqu'à C# 7.0, il n'y avait aucun moyen de faire cela sans définir votre propre type.

37voto

scottm Points 13578

Voici une version trop compliquée de ce que vous demandez :

class MyTuple : Tuple<int, int>
{
    public MyTuple(int one, int two)
        :base(one, two)
    {

    }

    public int OrderGroupId { get{ return this.Item1; } }
    public int OrderTypeId { get{ return this.Item2; } }

}

Pourquoi ne pas simplement créer une classe ?

28voto

Reproduisant ma réponse de este car il est mieux adapté ici.

À partir de C# v7.0, il est désormais possible de nommer les propriétés des n-uplets qui, auparavant, portaient par défaut des noms tels que Item1 , Item2 et ainsi de suite.

Nommer les propriétés des littéraux de tuple :

var myDetails = (MyName: "Foo", MyAge: 22, MyFavoriteFood: "Bar");
Console.WriteLine($"Name - {myDetails.MyName}, Age - {myDetails.MyAge}, Passion - {myDetails.MyFavoriteFood}");

La sortie sur la console :

Name - Foo, Age - 22, Passion - Bar

Retourner un Tuple (ayant des propriétés nommées) à partir d'une méthode :

static void Main(string[] args)
{
    var empInfo = GetEmpInfo();
    Console.WriteLine($"Employee Details: {empInfo.firstName}, {empInfo.lastName}, {empInfo.computerName}, {empInfo.Salary}");
}

static (string firstName, string lastName, string computerName, int Salary) GetEmpInfo()
{
    //This is hardcoded just for the demonstration. Ideally this data might be coming from some DB or web service call
    return ("Foo", "Bar", "Foo-PC", 1000);
}

La sortie sur la console :

Employee Details: Foo, Bar, Foo-PC, 1000

Création d'une liste de Tuples ayant des propriétés nommées

var tupleList = new List<(int Index, string Name)>
{
    (1, "cow"),
    (5, "chickens"),
    (1, "airplane")
};

foreach (var tuple in tupleList)
    Console.WriteLine($"{tuple.Index} - {tuple.Name}");

Sortie sur la console :

1 - cow  
5 - chickens  
1 - airplane

Note : Les extraits de code de ce billet utilisent la fonction d'interpolation de chaînes de caractères de C# v6, comme indiqué en détail. aquí .

15voto

Snap Points 70

TL:DR -> System.ValueTuple peuvent avoir des noms personnalisés pour les champs, System.Tuple ne le peuvent pas.

Pour clarifier, il existe deux types de tuples différents en C# 7.0 et plus.

System.Tuple y System.ValueTuple

Lorsque vous déclarez un tuple via l'option Tuple<...> classe :

public Tuple<int, string, int> GetUserInfo();

Vous déclarez un Tuple objet type de données.

Lorsque vous déclarez un tuple via des parenthèses :

public (int id, string name, int age) GetUserInfo();

Vous déclarez un ValueTuple valor type de données.

Chacun d'eux fonctionne et se comporte différemment. Dans votre question, votre méthode renvoie un System.Tuple objet.

Malheureusement, les objets Tuple créés via la méthode System.Tuple n'ont pas de fonctionnalité intégrée permettant de donner un nom personnalisé à chaque propriété. Ils ont toujours la valeur par défaut Item N en fonction du nombre de propriétés qu'ils contiennent.

System.ValueTuple d'autre part, les valeurs peuvent contenir des champs nommés personnalisés.

Pour plus d'informations, vous pouvez vous référer à Types de tuple (référence C#) et/ou les liens vers chaque classe ci-dessus. Mais essentiellement certaines des différences clés des 2 différents types de tuples que la documentation met en évidence sont :

tuples C#, qui sont soutenus par des System.ValueTuple sont différents des tuples qui sont représentés par des System.Tuple types. Les principales différences sont les suivantes :

  • System.ValueTuple sont des types de valeurs. System.Tuple sont des types de référence.
  • System.ValueTuple sont mutables. System.Tuple sont immuables.
  • Les membres des données de System.ValueTuple sont des champs. Les membres de données de System.Tuple sont des propriétés.

Ainsi, si votre méthode doit retourner un System.Tuple ou vous désirez davantage le comportement de ce type d'objet, alors au moment d'écrire ces lignes, vous ne pouvez pas obtenir ce que vous voulez. Cependant, si votre méthode peut retourner un System.ValueTuple vous pouvez alors lui donner des champs personnalisés dans la valeur renvoyée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X