我有一个必须实现的this函数:
protected override ValidationResult IsValid(
Object value,
ValidationContext validationContext
)
{
//Here is where I wanna test whether the following conversion is applicable
var x = Convert.ToInt64(value);
}我可以将这一行包装在try-catch块中,或者使用其他方法来执行测试,下面是其中之一:
var convertible = value as IConvertible;
if (convertible != null)
var x = convertible.ToInt64(null);做这件事最有效的方法是什么?
发布于 2012-02-19 10:12:25
您可以在这里定义一个默认值,如果解析(转换)适用,它将返回转换后的int64,否则将返回默认值:
Int64 DefaultValue = 0;
Int64.TryParse(MyVar , out DefaultValue);即:
Int64 DefaultValue = 0;
Int64.TryParse("1234" , out DefaultValue);DefaultValue将为1234
Int64 DefaultValue = 0;
Int64.TryParse("test" , out DefaultValue);DefaultValue将为0
您还可以通过像这样声明变量来使其更具破坏性:
Int64.TryParse("123" , out Int64 DefaultValue);发布于 2012-02-19 10:36:42
使用IConvertible对我来说最有效。
我做了一个简短的测试,用这种方式(6倍)更快,使用IConvertible,代码看起来也更干净,更少冗长,符合我的口味。
static void Main(string[] args)
{
var sw = new Stopwatch();
sw.Start();
for (short i = 0; i < short.MaxValue; i++)
{
var foo = IsValid1(i);
}
sw.Stop();
var result1 = sw.Elapsed;
Console.WriteLine(result1);
sw.Start();
for (short i = 0; i < short.MaxValue; i++)
{
var foo = IsValid2(i);
}
sw.Stop();
var result2 = sw.Elapsed;
Console.WriteLine(result2);
Console.ReadKey();
}
static bool IsValid1(object value)
{
var convertible = value as IConvertible;
if (convertible != null)
return convertible.ToInt64(null) != 0;
return true;
}
static bool IsValid2(object value)
{
if (value != null)
{
long amount;
if (long.TryParse(value.ToString(), out amount))
return amount != 0;
}
return true;
}输出:
00:00:00.0031987
00:00:00.0186700发布于 2012-02-19 10:13:37
那Int64.TryParse()呢?当然,您需要.ToString()您的value参数,否则我会认为这是工作。
https://stackoverflow.com/questions/9345999
复制相似问题