2012-11-28 2 views
3

나는 최소값과 최대 값 내에서 난수를 생성하는 일반적인 방법을 가지고있다. 또한 동일한 제한으로 범위를 벗어나는 값을 생성하는 비슷한 기능을 가지고 있습니다.일반 번호 매개 변수의 부호가 없는지 확인하는 방법은 무엇입니까?

하지만 사실은 필자가 작성해야하는 여러 유형의 변수가 있습니다. 일부 변수는 부호가 없으며 최소 - 최대 범위는 부호없는 유형과 동일합니다.

이러한 변수에 대한 범위를 벗어나는 값을 만들려고 할 때 변수의 한계를 초과합니다 (정확히 말하면 ushort).

이 내 일반적인 방법이다 : 나는 수가 긴으로 캐스팅 서명인지 확인하려고

private static U GenerateOutOfBounds<U>(U minimum, U maximum) where U : IComparable, IFormattable, IConvertible 
    { 
     bool b  = g.NextBoolean(); 
     long signCheckForMinimum = Convert.ToInt64(minimum); 
     double maxpp = g.NextDouble(Convert.ToDouble(maximum), Convert.ToDouble(maximum) + g.Next()); 
     double minpp = g.NextDouble(Convert.ToDouble(maximum), Convert.ToDouble(maximum) + g.Next()); 
     if (signCheckForMinimum >= 0) 
     { 
      b = true; 
     } 

     if (b) 
     { 
      return (U)Convert.ChangeType(maxpp, Type.GetTypeCode(typeof(U))); 
     } 
     else 
     { 
      return (U)Convert.ChangeType(minpp, Type.GetTypeCode(typeof(U))); 
     } 
    } 

하지만 지금은 그 접근 방식은 매우 거짓 입니다 볼 수 있습니다.

그래서 내가 가진 변수가 서명되지 않았는지 확인하거나 유형이 서명되지 않은 유형과 비교하지 않고 서명이 없는지 확인하는 방법이 있습니까?

+2

주된 방법은'GetTypeCode' (이미 사용하고있는)에서'switch '를하는 것이지만 솔직히 : 일반적인 메서드보다는 오히려 유형별 오버로드가 더 직접적 일 것입니다. –

+0

나는 그걸로 갈 것 같아. 적어도 더 우아한 솔루션입니다. – theaob

답변

6
bool signed = Convert.ToBoolean(typeof(U).GetField("MinValue").GetValue(null)); 

서명 유형은 부울 캐스트 동안 true로 변환합니다 제로 MinValue 상수를 보유하고 있습니다.

0

나는 param == abs (param)을 비교하여 답할 것이므로 음수인지를 결정하고 각각 처리 할 수 ​​있습니다. double (또는 가능한 최대 부호 숫자 유형)으로 상향 변환하려고하면 정밀도를 잃지 않습니다.

+0

최소 한도가 음수인지 아닌지 확인하여 할 수 있지만 매개 변수의 형식이 서명되지 않았는지 여부를 확인하는 데 도움이되지 않습니다. – theaob

관련 문제