什麼是確定以Object形式傳入的數值的符號的最佳(最快)方式?爲了清楚起見,該值可能是int,double,Decimal或其他與0相當的值。因此,我們需要Math.Sign模擬對象參數。Math.Sign with Object參數
解決方案需要考慮裝箱/拆箱問題以及。
什麼是確定以Object形式傳入的數值的符號的最佳(最快)方式?爲了清楚起見,該值可能是int,double,Decimal或其他與0相當的值。因此,我們需要Math.Sign模擬對象參數。Math.Sign with Object參數
解決方案需要考慮裝箱/拆箱問題以及。
解決方案還需要考慮裝箱/拆箱問題。
這是什麼意思?無論如何,你總是得到一個Object
,拆箱總是會發生。
最簡單的解決方法是將對象轉換爲double
並獲得簽收:
double d = Convert.ToDouble(obj);
return Math.Sign(d);
但是,我會認真質疑你的軟件的設計,如果有其中任意數量的類型被裝箱,並通過情況到一個功能。這通常不會發生。
這就是問題所在?是Convert.ToDouble最快的方法嗎?爲什麼不Convert.ToInt(obj)?我正在尋找最快的Sign(對象)實現。謝謝 – husayt 2011-05-05 11:45:52
@husayt我會這麼說。如果類型完全不受約束,那麼反正沒有太多的可能性。 Marc的'dynamic'變體在運行時至少會涉及'<'運算符的附加方法查找。 – 2011-05-05 11:49:25
@husayt通過'decimal.MaxValue'運行ToInt32; p – 2011-05-05 11:49:35
怎麼樣
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);
}
非常整齊。但這有多有效?謝謝 – husayt 2011-05-05 12:11:27
@husayt因爲'dynamic'緩存每種類型的實現,它應該是相當不錯的。但回答這個問題的唯一方法是配置 – 2011-05-05 12:41:19
當我通過簡單的StopWatch測試(測試每種類型,使用Konrad的ShowNeg實現)時,使用動態的版本較慢。但是,這是我更喜歡針對真實世界的數據運行的那種測試。我的測試過於專注並做出假設(例如,類型可能性相同)。也就是說,如果這個函數被合法地在對象上的一個緊密循環中調用,那麼我會建議修復這個循環以避免'Math.Sign'採用'Object'會帶來更多的好處。 – Brian 2011-05-05 13:40:56
或其他任何東西比得上0
然後將其轉換爲IComparable接口。
這是一個XY問題。 X是「如何避免拳擊」。這應該不成問題。 – 2011-05-05 12:07:33