[C#] 숫자가 범위 내에 있는지 우아하게 확인하는 방법은 무엇입니까?

C # 및 .NET 3.5 / 4로 어떻게 우아하게 수행 할 수 있습니까?

예를 들어, 숫자는 1과 100 사이 일 수 있습니다.

충분하다면 간단하다는 것을 안다. 그러나이 질문의 키워드는 우아합니다. 프로덕션 용이 아닌 장난감 프로젝트 용입니다.

이 질문은 속도가 아니라 코드의 아름다움에 관한 것입니다. 효율성과 그에 대한 이야기를 중단하십시오. 성가대에게 설교한다는 것을 기억하십시오.



답변

많은 옵션이 있습니다 :

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

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

또한이 SO 게시물 에서 정규식 옵션을 확인하십시오 .


답변

당신은 의미합니까?

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

또는

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


답변

여기에 노이즈를 추가하기 위해 확장 방법을 만들 수 있습니다.

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

다음과 같은 작업을 수행 할 수 있습니다 …

int val = 15;

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

말하자면, 이것은 수표 자체가 단 한 줄일 때 해야하는 바보 같은 것 같습니다.


답변

다른 사람들이 말했듯이 간단한 if를 사용하십시오.

주문에 대해 생각해야합니다.

예 :

1 <= x && x <= 100

보다 읽기 쉽다

x >= 1 && x <= 100


답변

프로덕션 코드에서는 간단히 작성합니다.

1 <= x && x <= 100

이해하기 쉽고 읽기 쉽습니다.


다음은 약간의 수학을 사용하여 비교 횟수를 2에서 1로 줄이는 영리한 방법입니다. 아이디어는 숫자가 범위를 벗어나면 두 요인 중 하나가 음수가되고 숫자가 경계 중 하나와 같으면 0이되는 것입니다.

범위가 포함 된 경우 :

(x - 1) * (100 - x) >= 0

또는

(x - min) * (max - x) >= 0

범위가 독점적 인 경우 :

(x - 1) * (100 - x) > 0

또는

(x - min) * (max - x) > 0


답변

나는 이것을 제안한다 :

public static bool IsWithin<T>(this T value, T minimum, T maximum) where T : IComparable<T> {
    if (value.CompareTo(minimum) < 0)
       return false;
    if (value.CompareTo(maximum) > 0)
       return false;
    return true;
}

예 :

45.IsWithin(32, 89)
true
87.2.IsWithin(87.1, 87.15)
false
87.2.IsWithin(87.1, 87.25)
true

물론 변수가있는 경우 :

myvalue.IsWithin(min, max)

읽기 쉽고 (인간의 언어에 가깝다) 모든 비교 가능한 유형 (정수, 이중, 사용자 정의 유형 …)과 함께 작동합니다.

개발자가 코드를 이해하기 위해 “브레인 사이클”을 낭비하지 않기 때문에 코드를 읽기 쉽게하는 것이 중요합니다. 코딩 세션이 길어지면 뇌주기가 낭비되어 개발자가 더 빨리 피곤해지고 버그가 발생하기 쉽습니다.


답변

약간의 확장 방법 남용으로 다음과 같은 “우아한”솔루션을 얻을 수 있습니다.

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!");
        }
    }
}