如何在.NET中检查存在文化

Jac*_*cek 16 .net c# globalization

我有这个代码,当我试图不存在的文化时,我得到例外.
是否存在TryGetCultureInfo返回bool值的方法?我不想使用try-catch声明

CultureInfo culture = CultureInfo.GetCultureInfo(cultureCode);
if (culture == null)
{
    culture = CultureInfo.GetCultureInfo(DefaultCultureCode);
}
Run Code Online (Sandbox Code Playgroud)

Ste*_* S. 24

您可以编写一个DoesCultureExist方法返回一个布尔值,如下所示:

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

  • 我自由地编辑您的代码,以便忽略大小写,因为这是`CultureInfo`通常的工作方式。 (3认同)

Tim*_*ter 17

我认为没有这样的方法.所以你可以try-catch或者检查所有已安装的文化:

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;
}
Run Code Online (Sandbox Code Playgroud)

但我更喜欢try-catch,我相信它更有效率.

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;
}
Run Code Online (Sandbox Code Playgroud)

  • `CultureInfo.GetCultureInfo("asd");` 不会抛出 `Exception`。所以这个答案是假的! (4认同)
  • 捕获特定的异常类型 (3认同)
  • 因为你只想捕获`CultureNotFoundException` - 类型确实很重要.还有很多其他异常可能会出现,你可能不想在这里吞下:例如,`ArgumentNullException`或`OutOfMemoryException`.此外,如果你没有命名参数,没有人会认为你正在使用异常 - `catch(CultureNotFoundException){culture = CultureInfo.CurrentCulture; }`.它展示了您的确切目标以及您期望发生的事情. (3认同)
  • 只想指出在3.5及更早版本的.NET中,抛出的异常确实是ArgumentException.CultureNotFoundException仅适用于4+.source = [link](http://msdn.microsoft.com/en-us/library/yck8b540.aspx) (3认同)
  • @AidanRyan:不知何故错过了`CultureNotFoundException`;)好吧,重点是,编辑了答案。谢谢。 (2认同)

Joh*_*son 8

如果你想要它快,你可以使用:

internal static class Culture
{
    private static readonly HashSet<string> CultureNames = CreateCultureNames();

    internal static bool Exists(string name)
    {
        return CultureNames.Contains(name);
    }

    private static HashSet<string> CreateCultureNames()
    {
        var cultureInfos = CultureInfo.GetCultures(CultureTypes.AllCultures)
                                      .Where(x => !string.IsNullOrEmpty(x.Name))
                                      .ToArray();
        var allNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
        allNames.UnionWith(cultureInfos.Select(x => x.TwoLetterISOLanguageName));
        allNames.UnionWith(cultureInfos.Select(x => x.Name));
        return allNames;
    }
}
Run Code Online (Sandbox Code Playgroud)