我正在将CSV文件解析为具有强类型属性的对象列表.这涉及从文件中的每个字符串值解析到一个IConvertible类型(int,decimal,double,DateTime使用等)TypeDescriptor.
我正在使用a try catch来处理解析失败时的情况.然后记录发生此异常的位置和原因的确切细节以供进一步调查.下面是实际解析代码:
try
{
parsedValue = TypeDescriptor.GetConverter(type).ConvertFromString(dataValue);
}
catch (Exception ex)
{
// Log failure
}
Run Code Online (Sandbox Code Playgroud)
问题:
成功解析值后,过程很快.在解析具有大量无效数据的数据时,该过程可能会慢几千倍(由于捕获异常).
我一直在测试这个解析DateTime.这些是性能数据:
这慢了4500多倍.
题:
我是否可以检查是否可以成功解析字符串值而无需使用我昂贵的try catch方法?或许还有另一种方法我应该这样做?
编辑:我需要使用TypeDescriptor(而不是DateTime.TryParse)因为类型是在运行时确定的.
我正在研究一个控件,它可以采用许多不同的数据类型(任何实现IComparable的东西).
我需要能够将这些与传入的另一个变量进行比较.
如果主数据类型是DateTime,并且我传递了一个String,我需要
所以我需要一种通用的方法来尝试从任何类型转换为任何类型.很简单,.Net为我们提供了TypeConverter类.
现在,我可以做的最好的事情是确定String是否可以转换为DateTime是使用异常.如果ConvertFrom引发异常,我知道我不能进行转换并且必须进行字符串比较.
以下是我得到的最好的:
string theString = "99/12/2009";
DateTime theDate = new DateTime ( 2009, 11, 1 );
IComparable obj1 = theString as IComparable;
IComparable obj2 = theDate as IComparable;
try
{
TypeConverter converter = TypeDescriptor.GetConverter ( obj2.GetType () );
if ( converter.CanConvertFrom ( obj1.GetType () ) )
{
Console.WriteLine ( obj2.CompareTo ( converter.ConvertFrom ( obj1 ) ) );
Console.WriteLine ( "Date comparison" );
}
}
catch ( FormatException )
{
Console.WriteLine ( obj1.ToString …Run Code Online (Sandbox Code Playgroud) (求助)我正在构建一个应用程序,它可以根据XML文件中的一些描述动态地创建它的一些控件.
我现在需要的是与TryParse()方法非常相似的东西:如果字符串变量中的文本可以转换(或解析)为一个类型,可以检查(没有抛出/捕获异常),我在其他变量中有这个名称(myType).
问题是myType可以是任何.NET类型:DateTime, Bool, Double, Int32等等.
例:
string testStringOk = "123";
string testStringWrong = "hello";
string myType = "System.Int32";
bool test1 = CanCovertTo(testStringOk, myType); //true
bool test2 = CanCovertTo(testStringWrong, myType); //false
Run Code Online (Sandbox Code Playgroud)
CanCovertTo(string testString, string testType)功能应该如何?
我得到的最接近的是以下代码:
private bool CanCovertTo(string testString, string testType)
{
Type type = Type.GetType(testType, null, null);
TypeConverter converter = TypeDescriptor.GetConverter(type);
converter.ConvertFrom(testString); //throws exception when wrong type
return true;
}
Run Code Online (Sandbox Code Playgroud)
但是,它在尝试从错误的字符串转换时抛出异常,我不想使用try {} catch()它.
解:
private bool CanCovertTo(string testString, string …Run Code Online (Sandbox Code Playgroud)