Cómo comprobar la cultura existente en .NET

Tengo este código, cuando trato de conseguir una cultura no existente obtengo una excepción.
¿Existe un método como TryGetCultureInfo , que devuelve un valor bool ? No quiero usar la sentencia try-catch

 CultureInfo culture = CultureInfo.GetCultureInfo(cultureCode); if (culture == null) { culture = CultureInfo.GetCultureInfo(DefaultCultureCode); } 

Creo que no hay tal método. Así que puedes try-catch o try-catch todos los cultivos instalados:

 string cultureCode = "de-DE"; CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures & ~CultureTypes.NeutralCultures); var culture = cultures.FirstOrDefault(c => c.Name.Equals(cultureCode, StringComparison.OrdinalIgnoreCase)); if (culture == null) { culture = cultures.FirstOrDefault(c => c.Name.Equals(DefaultCultureCode, StringComparison.OrdinalIgnoreCase)); if (culture == null) culture = CultureInfo.CurrentCulture; } 

Pero preferiría el try-catch , estoy seguro de que es más eficiente.

 public bool TryGetCultureInfo(string cultureCode, string DefaultCultureCode, out CultureInfo culture) { try { culture = CultureInfo.GetCultureInfo(cultureCode); return true; } catch(CultureNotFoundException) { if (DefaultCultureCode == null) culture = CultureInfo.CurrentCulture; else { try { culture = CultureInfo.GetCultureInfo(DefaultCultureCode); } catch (CultureNotFoundException) { culture = CultureInfo.CurrentCulture; } } } return false; } 

Podría escribir un método DoesCultureExist que devuelva un valor booleano como este:

 private static bool DoesCultureExist(string cultureName) { return CultureInfo.GetCultures(CultureTypes.AllCultures).Any(culture => string.Equals(culture.Name, cultureName, StringComparison.CurrentCultureIgnoreCase)); } 

Si quieres que sea rápido puedes usar:

 internal static class Culture { private static readonly HashSet CultureNames = CreateCultureNames(); internal static bool Exists(string name) { return CultureNames.Contains(name); } private static HashSet CreateCultureNames() { var cultureInfos = CultureInfo.GetCultures(CultureTypes.AllCultures) .Where(x => !string.IsNullOrEmpty(x.Name)) .ToArray(); var allNames = new HashSet(StringComparer.OrdinalIgnoreCase); allNames.UnionWith(cultureInfos.Select(x => x.TwoLetterISOLanguageName)); allNames.UnionWith(cultureInfos.Select(x => x.Name)); return allNames; } } 

No, AFAIK no es posible. Puedes verificar primero si existe la cultura y en ese caso obtenerla.

El siguiente código muestra cómo hacerlo:

  private static CultureInfo GetCulture(string name) { if (!CultureExists(name)) return null; return CultureInfo.GetCultureInfo(name); } private static bool CultureExists(string name) { CultureInfo[] availableCultures = CultureInfo.GetCultures(CultureTypes.AllCultures); foreach (CultureInfo culture in availableCultures) { if (culture.Name.Equals(name)) return true; } return false; } 

Espero eso ayude