2015-04-27 7 views
0

Некоторые типы имеют метод TryParse, например Int32, Int64, Boolean и т. Д. Он позволяет проверять значение строки без блока try \ catch. Это очень влияет на производительность, когда многие неправильные значения обрабатываются в цикле. Мне нужно сделать то же самое для строкового значения LCID. Но класс CultureInfo не имеет метода TryParse.Как проверить проверку LCID без try catch block?

CultureInfo culture = null; 
try { 
    culture = CultureInfo.GetCultureInfo(Convert.ToInt32(lcid, 16)); 
} 
catch { 
} 

Как я могу переписать этот код?

+2

Есть что-нибудь не так с этим кодом? Если бы в рамках данной схемы был бы такой метод, ему все равно пришлось бы попробовать/поймать. Если вас беспокоит кратковременность кода, вы можете создать метод расширения для типа строки. –

+0

Нет, меня не интересует кратковременность кода. Но это очень влияет на производительность, когда многие неправильные значения обрабатываются в цикле. Здесь я показал некоторые результаты о сравнении варианта try \ catch и «TryGetObjectId» (это некоторая аналогия «TryParse»): https://sites.google.com/site/bushmansnetlaboratory/sendbox/stati/database/ сравнить 00: 05: 30,4050567 и 00: 00: 00,7027717. Большая разница в производительности. –

ответ

3

Вы можете кэшировать все объекты CultureInfo от LCID в словаре:

var culturesByLcid = CultureInfo 
    .GetCultures(CultureTypes.AllCultures) 
    .ToDictionary(c => c.LCID, c => c); 

и использовать TryGetValue как:

CultureInfo found; 
if (culturesByLcid.TryGetValue(lcid, out found)) 
{ 
    ... 
}