2010-12-15 22 views
0

Est-ce que j'utilise cette méthode de manière correcte? Pour autant que je le comprends, le contrôle suivant doit être faux:C# Utilisation de Enumerable.Range()

int myVal = 37; 
if (Enumerable.Range(0, 10).Contains(myVal)) 
    // Do something 
else if (Enumerable.Range(11, 33).Contains(myVal)) 
    // Do somethiong else 

Mais je semble obtenir des cas où //Do somethiong else est exécuté. Est-ce que je ne peux pas utiliser Enumerable.Range de cette façon?

Répondre

17

La signature donne un indice:

public static IEnumerable<int> Range(
    int start, 
    int count 
) 

Le premier paramètre est appelé commencer; la seconde est appelée compter. Donc, votre deuxième appel renvoie 33 valeurs commençant par 11, qui inclura 37.

+0

bon de savoir, mais je me demande combien de gens pensent intuitivement que! Je souhaite que les paramètres correspondent aux utilisations les plus évidentes de l'OMI. – Chad

+1

@Chad: OK, supposons que nous l'ayons fait à votre façon. Comment représentez-vous (1) une plage vide, (2) une plage qui a comme dernier élément Int32.MaxValue? –

+0

@Eric: Assez juste pour une plage vide (que diriez-vous de Enumerable.Empty like String.Empty?), Mais ne pourriez-vous pas simplement faire Enumerable.Range (0, Int32.MaxValue) pour avoir le dernier élément Int32.MaxValue dans la version (début, fin)? – Chad

10

Si cet exemple particulier, il est inefficace de créer un énumérer de cette manière simplement pour vérifier qu'une valeur se situe dans une plage particulière. if (x < y) est probablement mieux.

+0

+1: Aussi très vrai. –

+2

O (n) par rapport à O (1), brrr. –

1

Il en résultera chaque valeur en cours de vérification, et est un peu confus, pourquoi ne pas faire:

int myVal = 37; 
if (myVal >= 0 && myVal <= 10) 
    // Do something 
else if (myVal <= 33) 
    // Do somethiong else