7
votes

C # dans la surcharge de l'opérateur

Je viens d'avoir une idée du dernier nigth lors de l'écriture d'une expression if Et parfois, l'expression a tendance à être longue quand vous l'avez comme ceci:

if(x in (1,2,33,4,-5,61)) { ... }


1 commentaires

Je trouve le titre un peu déroutant. On dirait que vous voulez utiliser C # dans une surcharge de l'opérateur. Je mets dans les casquettes pour un manque d'une meilleure idée de la façon de rendre cela plus clair.


6 Réponses :


13
votes

Essayez le suivant

if ( (new []{1,2,33,4,-5,61}).Any(i => x == i) ) {
  ...
}


5 commentaires

Avec une inférence de type, vous pouvez même sauter le int (je pense).


@Svish, n'a pas réalisé que c'était possible mais vérifié cela fonctionne avec Beta2 2010. Réponse mise à jour


J'utiliserais nouveau [] {1,2,33,4, -5,61}). Contient (x) , contient est généralement utilisé pour déterminer si une séquence contient un élément et donc plus explicite En exprimant l'intention, tout () est plus générique, même vous pouvez le faire agir comme contient en utilisant un simple contrôle d'égalité


Je pense que la voie de la méthode de l'extension est une meilleure conception. Dans votre solution, vous avez duplicant la logique de la fonction dans chaque fois que vous l'utilisez. Avec la méthode d'extension, l'algorithme est centralisé et peut être changé globalement si nécessaire - plus il a également l'air plus propre au point d'utilisation.


C'est assez moche. L'approche de la méthode d'extension est beaucoup plus claire et plus facile à lire.



0
votes
   string[] possible = new string[3] { 1, 2, 3);

   if (possible.Contains(x)) { ...

2 commentaires

Je pense que tu voulais et ne pas la corde là-bas.


Je pense que la question était destinée à tous les types.



0
votes
    bool In<T>(T num, params int args)
    {
        return (new List<T>(args)).Contains(num);
    }

1 commentaires

Pourquoi avoir une méthode générique qui ne prend qu'une liste d'INTS? Pensez à utiliser les params t [] args - que vous pouvez ensuite appeler .Contient directement.



1
votes
    public static bool In<T>(this T X, params T[] list)
    {
        foreach (var item in list)
        {
            if (X.Equals(item))
                return true;
        }
        return false;
    }

3 commentaires

Que diriez-vous de return list.Contains (x); ?


tableau n'a pas de méthode


Implexes de tableau iEnumerable qui contient une méthode d'extension contient dans System.Linq



0
votes

étant donné que x est un int, vous pouvez écrire une méthode d'extension, comme: xxx


0 commentaires

18
votes

J'écris habituellement un méthode d'extension comme suit:

if(x.In(1,6,9,11))
{
      // do something....
}


2 commentaires

J'aime celui-ci car il est générique et utilise la méthode contenant plutôt que l'opérateur ==.


Je ne peux pas les pouces assez de ça ... ça se sent tellement plus naturel. J'ai également ajouté une surcharge: Statique publique Bool dans (cette source T, iEnumerable liste) avec le même organisme.