C# 如何检查 .NET 中存在的文化
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/13723790/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to check exists culture in .NET
提问by Jacek
I have this code, when I try to get not existed culture I get exception.
Is there exists method like TryGetCultureInfo, which return boolvalue? I don't want to use try-catchstatement
我有这个代码,当我试图获得不存在的文化时,我得到了例外。
是否存在类似的方法TryGetCultureInfo,哪个返回bool值?我不想使用try-catch声明
CultureInfo culture = CultureInfo.GetCultureInfo(cultureCode);
if (culture == null)
{
culture = CultureInfo.GetCultureInfo(DefaultCultureCode);
}
采纳答案by Tim Schmelter
I think there's no such method. So you could just try-catchor check all installed cultures:
我认为没有这样的方法。因此,您可以只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;
}
But i would prefer the try-catch, i'm sure it is more efficient.
但我更喜欢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;
}
回答by Daniel Pe?alba
No, AFAIK is not possible. You can check first if the culture exists and in that case get it.
不,AFAIK 是不可能的。您可以先检查文化是否存在,然后在这种情况下获取它。
The following code shows how to do it:
以下代码显示了如何执行此操作:
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;
}
Hope it helps
希望能帮助到你
回答by Steven S.
You could write a DoesCultureExist method returning a boolean value just like this:
您可以编写一个返回布尔值的DoesCultureExist 方法,如下所示:
private static bool DoesCultureExist(string cultureName)
{
return CultureInfo.GetCultures(CultureTypes.AllCultures).Any(culture => string.Equals(culture.Name, cultureName, StringComparison.CurrentCultureIgnoreCase));
}
回答by Johan Larsson
If you want it to be fast you can use:
如果你希望它很快,你可以使用:
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;
}
}

