11
votes

Avoir à mettre en œuvre un générique inférieur à et supérieur à celui de l'opération

Je ne peux absolument pas du papier dur de type de données. J'ai besoin de taper des données strictes. Je dois utiliser TVALUE A <= TVALUE B. Encore une fois, il n'y a absolument aucun moyen de faire quelque chose comme (double) a. Cela fait partie d'une implémentation de la bibliothèque essentielle. La seule chose qui est spécifique sur les valeurs génériques est qu'elles sont des types statiques. Icomarable et d'autres interfaces ne semblent pas fonctionner.


1 commentaires

Vous avez donné un +1 tandis que vous admettez aussi que vous ne savez pas quelle était la question? :-)


3 Réponses :


51
votes

Pourquoi ne fonctionne pas icomarable pour vous?

Vous ne pouvez pas obtenir le sucre syntaxique d'utiliser les symboles «<» et «>», mais vous pouvez vérifier si le résultat de la comparète est inférieur ou supérieur à 0, ce qui vous donne la même information.

Vous pouvez même écrire une belle méthode d'extension pour faciliter le fonctionnement. xxx


1 commentaires

Ou contraindre à icomparable .



4
votes

Pouvez-vous être plus précis avec votre type de données et votre cas d'utilisation?

Après tout, pour mettre en œuvre une opération de comparaison, vous aurez besoin d'une sorte d'informations sur la classe; Une implémentation entièrement générique ne contenait généralement pas les informations nécessaires pour comparer deux objets - sauf si vous souhaitez les trier sur GetHashCode () ou ToString (), ce qui est assez étrange à faire.

Il existe différentes interfaces génériques destinées à la comparaison de type sécurisée:

  • Icomarable sur les objets eux-mêmes
  • icomparer en tant que mise en œuvre de comparaison externe.

    si vous avez implémenté icomparable ou icomparable sur votre type, vous pouvez utiliser comparateur .default à Obtenez la dernière variante automatiquement - ce qui rend les consommateurs de comparaison un peu plus court à écrire et constitue une alternative pour une contrainte générique nécessitant le type d'être icomparable . .


1 commentaires

+1 pour expliquer ce que comparateur .default fait et quand c'est utile.



23
votes

Il suffit d'utiliser system.collections.generic.comparer .default.cacher (x, y) - et recherchez des valeurs négatives, positives et 0 retournement.

Ceci prend en charge les deux icomparable et icomparable et fonctionne pour les classes, les structures et nullable -of-structs.


3 commentaires

Cela semble faire l'affaire. J'utilise Beta Visual Studio Express 2010 et IntelliSense ne semblait pas reconnaître cette situation. Comportement très étrange.


@gabe: Ils sont une manière abriante d'écrire "positif" et "négatif".


Il semble que <0 et > 0 est à la fois plus court et plus intuitif.