EDYCJA: Podano nową odpowiedź. Zacząłem używać C #, kiedy napisałem pierwszą odpowiedź na to pytanie, iz perspektywy czasu zdaję sobie sprawę, że moje „rozwiązanie” było / jest naiwne i nieefektywne.
Moja pierwotna odpowiedź: wybrałbym prostszą wersję:
if(Enumerable.Range(1,100).Contains(intInQuestion)) { ...DoStuff; }
Lepszy sposób
Ponieważ nie widziałem innego rozwiązania, które byłoby bardziej wydajne (przynajmniej według moich testów), spróbuję jeszcze raz.
Nowy i lepszy sposób, który działa również z zakresami ujemnymi :
// Returns true if x is in range [min..max], else false
bool inRange(int x, int min=1, int max=100) => ((x - max)*(x - min) <= 0);
Można tego używać zarówno z dodatnimi, jak i ujemnymi zakresami, a domyślnie jest to zakres
1..100 (włącznie) i używa x
jako liczby do sprawdzenia, po której następuje opcjonalny zakres zdefiniowany przez min
i max
.
Dodawanie przykładów dobrej miary
Przykład 1:
// Returns true if x is in range [min..max], else false
bool inRange(int x, int min=1, int max=100) => ((x - max)*(x - min) <= 0);
Console.WriteLine(inRange(25));
Console.WriteLine(inRange(1));
Console.WriteLine(inRange(100));
Console.WriteLine(inRange(25, 30, 150));
Console.WriteLine(inRange(-25, -50, 0));
Zwroty:
True
True
True
False
True
Przykład 2: użycie listy losowych liczb całkowitych od 1 do 150
// Returns true if x is in range [min..max], else false
bool inRange(int x, int min=1, int max=100) => ((x - max)*(x - min) <= 0);
// Generate 100000 ints between 1 and 150
var intsToCheck = new List<int>();
var randGen = new Random();
for(int i = 0; i < 100000; ++i){
intsToCheck.Add(randGen.Next(150) + 1);
}
var counter = 0;
foreach(int n in intsToCheck) {
if(inRange(n)) ++counter;
}
Console.WriteLine("{0} ints found in range 1..100", counter);
Zwroty:
66660 ints found in range 1..100
Czas wykonania: 0,016 sekund (s)