如果您有一組已知的轉換類型,則可以對if/elseif/elseif/else
(或類型名稱上的switch/case
)執行一系列轉換,以將其分配給專門的解析方法。這應該是相當快的。這如@Fabio's answer中所述。
如果您仍然有性能問題,你還可以創建一個查找表,這將讓你添加新的分析方法,因爲你需要支持他們:
鑑於一些基本的解析包裝:
public delegate bool TryParseMethod<T>(string input, out T value);
public interface ITryParser
{
bool TryParse(string input, out object value);
}
public class TryParser<T> : ITryParser
{
private TryParseMethod<T> ParsingMethod;
public TryParser(TryParseMethod<T> parsingMethod)
{
this.ParsingMethod = parsingMethod;
}
public bool TryParse(string input, out object value)
{
T parsedOutput;
bool success = ParsingMethod(input, out parsedOutput);
value = parsedOutput;
return success;
}
}
然後,您可以安裝一個轉換的輔助它執行查詢和調用適當的解析器:
public static class DataConversion
{
private static Dictionary<Type, ITryParser> Parsers;
static DataConversion()
{
Parsers = new Dictionary<Type, ITryParser>();
AddParser<DateTime>(DateTime.TryParse);
AddParser<int>(Int32.TryParse);
AddParser<double>(Double.TryParse);
AddParser<decimal>(Decimal.TryParse);
AddParser<string>((string input, out string value) => {value = input; return true;});
}
public static void AddParser<T>(TryParseMethod<T> parseMethod)
{
Parsers.Add(typeof(T), new TryParser<T>(parseMethod));
}
public static bool Convert<T>(string input, out T value)
{
object parseResult;
bool success = Convert(typeof(T), input, out parseResult);
if (success)
value = (T)parseResult;
else
value = default(T);
return success;
}
public static bool Convert(Type type, string input, out object value)
{
ITryParser parser;
if (Parsers.TryGetValue(type, out parser))
return parser.TryParse(input, out value);
else
throw new NotSupportedException(String.Format("The specified type \"{0}\" is not supported.", type.FullName));
}
}
然後使用可能是這樣的:
//for a known type at compile time
int value;
if (!DataConversion.Convert<int>("3", out value))
{
//log failure
}
//or for unknown type at compile time:
object value;
if (!DataConversion.Convert(myType, dataValue, out value))
{
//log failure
}
這可能會擴大仿製藥,以避免object
拳擊和類型鑄造,但因爲它站立這工作得很好;如果你有一個可衡量的表現,也許只是優化這個方面。
編輯:您可以更新DataConversion.Convert
方法,以便如果它沒有註冊指定的轉換器,它可以回退到您的TypeConverter
方法或拋出適當的異常。如果你想擁有一個全面的或者只是有你預定義的支持類型,並且避免再次使用你的產品,這取決於你。就目前而言,代碼已更新爲拋出NotSupportedException
並顯示一條消息,指示不支持的類型。隨意調整,因爲它是有道理的。在性能方面,也許這樣做是有道理的,因爲一旦你爲最常用的類型指定了專門的解析器,那麼可能會更少和更多。
如果您知道'type',您可以嘗試手動觸碰每個人的各種'TryParse'方法並查看是否有幫助。 –
您是否試圖敲擊每個類型的解析器,以查看哪一個與CSV條目兼容?也就是說,首先嚐試'DateTime',然後嘗試'int',然後嘗試'decimal',然後嘗試'double',然後將所有內容轉換爲'string'?或者你知道某個條目應該是'DateTime',但有時/通常數據本身的格式不正確? –
另外,你是在'release'模式還是'debug'模式下執行這個基準測試,還是附加了調試器?如果在「調試」模式下,它可能會出於調試目的報告/存儲過多的異常/堆棧信息。 –