相关疑难解决方法(0)

检查字符串是否可以解析的最快方法

我正在将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.这些是性能数据:

  • 成功解析:每次解析平均32个滴答
  • 解析失败:每次解析平均146296个滴答

这慢了4500多倍.

题:

我是否可以检查是否可以成功解析字符串值而无需使用我昂贵的try catch方法?或许还有另一种方法我应该这样做?

编辑:我需要使用TypeDescriptor(而不是DateTime.TryParse)因为类型是在运行时确定的.

.net c# performance parsing exception

18
推荐指数
2
解决办法
8798
查看次数

一般类型转换没有冒外线的风险

我正在研究一个控件,它可以采用许多不同的数据类型(任何实现IComparable的东西).

我需要能够将这些与传入的另一个变量进行比较.

如果主数据类型是DateTime,并且我传递了一个String,我需要

  • 尝试将String转换为DateTime以执行日期比较.
  • 如果String无法转换为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)

c# type-conversion

7
推荐指数
2
解决办法
6269
查看次数

测试字符串是否可以转换为其他各种类型

(求助)我正在构建一个应用程序,它可以根据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)

c# .net-4.0 visual-studio-2010

5
推荐指数
2
解决办法
3150
查看次数