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).

0voto

Devils Child Points 1690

Pourquoi tout le monde rend la vie si difficile. Les tuples sont plutôt pour données temporaires traitement. Travailler en permanence avec des Tuples rendra le code très difficile à comprendre à un moment donné. Créer des classes pour todo pourrait éventuellement gonfler votre projet.

C'est une question d'équilibre, cependant...

Votre problème semble être quelque chose pour lequel vous voudriez une classe. Et juste pour être complet, cette classe ci-dessous contient également des constructeurs.


C'est le modèle approprié pour

  • Un type de données personnalisé
    • sans autre fonctionnalité. Les récupérateurs et les régleurs peuvent également être développés avec du code, en obtenant/réglant des membres privés avec le modèle de nom "_orderGroupId", tout en exécutant également du code fonctionnel.
  • Inclure les constructeurs. Vous pouvez également choisir d'inclure un seul constructeur si todo sont obligatoires.
  • Si vous voulez utiliser tous les constructeurs, le bouillonnement comme celui-ci est le modèle approprié pour éviter la duplication du code.

public class OrderRelatedIds
{
    public int OrderGroupId { get; set; }
    public int OrderTypeId { get; set; }
    public int OrderSubTypeId { get; set; }
    public int OrderRequirementId { get; set; }

    public OrderRelatedIds()
    {
    }
    public OrderRelatedIds(int orderGroupId)
        : this()
    {
        OrderGroupId = orderGroupId;
    }
    public OrderRelatedIds(int orderGroupId, int orderTypeId)
        : this(orderGroupId)
    {
        OrderTypeId = orderTypeId;
    }
    public OrderRelatedIds(int orderGroupId, int orderTypeId, int orderSubTypeId)
        : this(orderGroupId, orderTypeId)
    {
        OrderSubTypeId = orderSubTypeId;
    }
    public OrderRelatedIds(int orderGroupId, int orderTypeId, int orderSubTypeId, int orderRequirementId)
        : this(orderGroupId, orderTypeId, orderSubTypeId)
    {
        OrderRequirementId = orderRequirementId;
    }
}

Ou, si vous voulez que ce soit vraiment simple : Vous pouvez aussi utiliser des initialisateurs de type :

OrderRelatedIds orders = new OrderRelatedIds
{
    OrderGroupId = 1,
    OrderTypeId = 2,
    OrderSubTypeId = 3,
    OrderRequirementId = 4
};

public class OrderRelatedIds
{
    public int OrderGroupId;
    public int OrderTypeId;
    public int OrderSubTypeId;
    public int OrderRequirementId;
}

0voto

J'écrirais les noms des éléments dans le résumé Ainsi, en survolant la fonction helloworld(), le texte dira hello = élément 1 et world = élément 2.

 helloworld("Hi1,Hi2");

/// <summary>
/// Return hello = Item1 and world Item2
/// </summary>
/// <param name="input">string to split</param>
/// <returns></returns>
private static Tuple<bool, bool> helloworld(string input)
{
    bool hello = false;
    bool world = false;
    foreach (var hw in input.Split(','))
    {
        switch (hw)
        {
            case "Hi1":
                hello= true;
                break;
            case "Hi2":
                world= true;
                break;
        }

    }
    return new Tuple<bool, bool>(hello, world);
}

-1voto

s-s Points 39

Vous pouvez écrire une classe qui contient le Tuple.

Vous devez modifier les fonctions Equals et GetHashCode.

et les opérateurs == et !=.

class Program
{
    public class MyTuple
    {
        private Tuple<int, int> t;

        public MyTuple(int a, int b)
        {
            t = new Tuple<int, int>(a, b);
        }

        public int A
        {
            get
            {
                return t.Item1;
            }
        }

        public int B
        {
            get
            {
                return t.Item2;
            }
        }

        public override bool Equals(object obj)
        {
            return t.Equals(((MyTuple)obj).t);
        }

        public override int GetHashCode()
        {
            return t.GetHashCode();
        }

        public static bool operator ==(MyTuple m1, MyTuple m2)
        {
            return m1.Equals(m2);
        }

        public static bool operator !=(MyTuple m1, MyTuple m2)
        {
            return !m1.Equals(m2);
        }
    }

    static void Main(string[] args)
    {
        var v1 = new MyTuple(1, 2);
        var v2 = new MyTuple(1, 2);

        Console.WriteLine(v1 == v2);

        Dictionary<MyTuple, int> d = new Dictionary<MyTuple, int>();
        d.Add(v1, 1);

        Console.WriteLine(d.ContainsKey(v2));
    }
}

reviendra :

Véritable

Véritable

-2voto

Sumesh Es Points 24

Exemple de tuple en C# 7

var tuple = TupleExample(key, value);

     private (string key1, long value1) ValidateAPIKeyOwnerId(string key, string value)
            {
                return (key, value);
            }
      if (!string.IsNullOrEmpty(tuple.key1) && tuple.value1 > 0)
          {
                    //your code

                }

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