2011-05-05 42 views
1

什麼是確定以Object形式傳入的數值的符號的最佳(最快)方式?爲了清楚起見,該值可能是int,double,Decimal或其他與0相當的值。因此,我們需要Math.Sign模擬對象參數。Math.Sign with Object參數

解決方案需要考慮裝箱/拆箱問題以及。

+0

這是一個XY問題。 X是「如何避免拳擊」。這應該不成問題。 – 2011-05-05 12:07:33

回答

2

解決方案還需要考慮裝箱/拆箱問題。

這是什麼意思?無論如何,你總是得到一個Object,拆箱總是會發生。

最簡單的解決方法是將對象轉換爲double並獲得簽收:

double d = Convert.ToDouble(obj); 
return Math.Sign(d); 

但是,我會認真質疑你的軟件的設計,如果有其中任意數量的類型被裝箱,並通過情況到一個功能。這通常不會發生。

+0

這就是問題所在?是Convert.ToDouble最快的方法嗎?爲什麼不Convert.ToInt(obj)?我正在尋找最快的Sign(對象)實現。謝謝 – husayt 2011-05-05 11:45:52

+0

@husayt我會這麼說。如果類型完全不受約束,那麼反正沒有太多的可能性。 Marc的'dynamic'變體在運行時至少會涉及'<'運算符的附加方法查找。 – 2011-05-05 11:49:25

+2

@husayt通過'decimal.MaxValue'運行ToInt32; p – 2011-05-05 11:49:35

1

怎麼樣

bool isNeg = ((dynamic)value) < 0; 

我還沒有測試過所有類型,但看起來可行。

更新:似乎對於大多數工作:

static void Main() 
{ 
    ShowNeg(byte.MinValue); ShowNeg(byte.MaxValue); 
    ShowNeg(ushort.MinValue); ShowNeg(ushort.MaxValue); 
    ShowNeg(uint.MinValue); ShowNeg(uint.MaxValue); 
    ShowNeg(ulong.MinValue); ShowNeg(ulong.MaxValue); 
    ShowNeg(sbyte.MinValue); ShowNeg(sbyte.MaxValue); 
    ShowNeg(short.MinValue); ShowNeg(short.MaxValue); 
    ShowNeg(int.MinValue); ShowNeg(int.MaxValue); 
    ShowNeg(long.MinValue); ShowNeg(long.MaxValue); 
    ShowNeg(float.MinValue); ShowNeg(float.MaxValue); 
    ShowNeg(double.MinValue); ShowNeg(double.MaxValue); 
    ShowNeg(decimal.MinValue); ShowNeg(decimal.MaxValue); 
} 
static void ShowNeg(object value) 
{ 
    bool isNeg = ((dynamic)value) < 0; 
    Console.WriteLine(isNeg); 
} 
+0

非常整齊。但這有多有效?謝謝 – husayt 2011-05-05 12:11:27

+0

@husayt因爲'dynamic'緩存每種類型的實現,它應該是相當不錯的。但回答這個問題的唯一方法是配置 – 2011-05-05 12:41:19

+1

當我通過簡單的StopWatch測試(測試每種類型,使用Konrad的ShowNeg實現)時,使用動態的版本較慢。但是,這是我更喜歡針對真實世界的數據運行的那種測試。我的測試過於專注並做出假設(例如,類型可能性相同)。也就是說,如果這個函數被合法地在對象上的一個緊密循環中調用,那麼我會建議修復這個循環以避免'Math.Sign'採用'Object'會帶來更多的好處。 – Brian 2011-05-05 13:40:56

0

或其他任何東西比得上0

然後將其轉換爲IComparable接口。

相關問題