267 votes

Comment vérifier de manière élégante si un nombre est compris dans un intervalle ?

Comment puis-je faire cela de manière élégante avec C# ?

Par exemple, un nombre peut être compris entre 1 et 100.

Je connais un simple if (x >= 1 && x <= 100) suffirait ; mais avec beaucoup de sucre syntaxique et de nouvelles fonctionnalités ajoutées en permanence à C#/.Net, cette question porte sur des façons plus idiomatiques (on peut parler d'élégance) d'écrire cela.

La performance n'est pas un problème, mais veuillez ajouter une note de performance aux solutions qui ne sont pas O(1) car les gens peuvent copier-coller les suggestions.

212voto

Dustin Laine Points 22815

Il y a beaucoup d'options :

int x = 30;
if (Enumerable.Range(1,100).Contains(x))  //true

Et en effet, la base if On peut écrire plus élégamment en inversant l'ordre dans la première vérification :

if (1 <= x && x <= 100)   //true

Aussi, regardez ça SO post pour les options de regex.

Notes :

  • La solution LINQ est strictement pour les points de style - puisque Contains itère sur tous les éléments, sa complexité est O(range_size) et non O(1) normalement attendue d'une vérification de gamme.
    Version plus générique pour d'autres plages (remarquez que le second argument est count, et non end) :

    if (Enumerable.Range(start, end - start + 1).Contains(x)
  • La tentation est grande d'écrire if solution sans && comme 1 <= x <= 100 - qui semblent très élégants, mais qui, en C#, conduisent à une erreur de syntaxe "L'opérateur '<=' ne peut pas être appliqué aux opérandes de type 'bool' et 'int'".

117voto

Kevin Points 57797

Vous voulez dire ?

if(number >= 1 && number <= 100)

ou

bool TestRange (int numberToCheck, int bottom, int top)
{
  return (numberToCheck >= bottom && numberToCheck <= top);
}

79voto

Adam Robinson Points 88472

Juste pour ajouter au bruit ici, vous pourriez créer une méthode d'extension :

public static bool IsWithin(this int value, int minimum, int maximum)
{
    return value >= minimum && value <= maximum;
}

Ce qui vous permettrait de faire quelque chose comme...

int val = 15;

bool foo = val.IsWithin(5,20);

Ceci étant dit, cela semble être une chose stupide à faire lorsque le contrôle lui-même ne comporte qu'une seule ligne.

51voto

Comme d'autres l'ont dit, utilisez un simple si.

Vous devriez penser à la commande.

Par exemple

1 <= x && x <= 100

est plus facile à lire que

x >= 1 && x <= 100

22voto

Ferruccio Points 51508

Avec un peu d'abus de méthode d'extension, nous pouvons obtenir la solution "élégante" suivante :

using System;

namespace Elegant {
    public class Range {
        public int Lower { get; set; }
        public int Upper { get; set; }
    }

    public static class Ext {
        public static Range To(this int lower, int upper) {
            return new Range { Lower = lower, Upper = upper };
        }

        public static bool In(this int n, Range r) {
            return n >= r.Lower && n <= r.Upper;
        }
    }

    class Program {
        static void Main() {
            int x = 55;
            if (x.In(1.To(100)))
                Console.WriteLine("it's in range! elegantly!");
        }
    }
}

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