我正在使用此标准代码填充国家/地区列表:
static void Main(string[] args)
{
List cultureList = new List();
CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures & ~CultureTypes.NeutralCultures);
foreach (CultureInfo culture in cultures)
{
try
{
RegionInfo region = new RegionInfo(culture.LCID);
if (!(cultureList.Contains(region.EnglishName)))
{
cultureList.Add(region.EnglishName);
Console.WriteLine(region.EnglishName);
}
}
catch (ArgumentException ex)
{
// just ignore this
continue;
}
}
}
我看到有些国家被遗漏了。只是想知道这种情况的原因是什么?
答案 0 :(得分:7)
CultureInfo.GetCultures
不旨在成为世界上所有文化的完整和明确的列表。 仅旨在为您提供可在计算机上找到的文化。
请记住,文化名称和标识符仅代表a 可以在特定计算机上找到的文化子集。视窗 版本或Service Pack可以更改可用的文化。 应用程序使用CultureAndRegionInfoBuilder添加自定义文化 类。用户使用Microsoft Locale添加自己的自定义文化 生成器工具。 Microsoft Locale Builder是用托管代码编写的 使用CultureAndRegionInfoBuilder类。
MSDN上可能有用的链接:
顺便说一句,您可以使用简单的LINQ'命令'缩短代码:
var regionInfos = CultureInfo.GetCultures(CultureTypes.SpecificCultures)
.Select(c => new RegionInfo(c.LCID))
.Distinct()
.ToList();
答案 1 :(得分:2)
你没有得到所有文化:
CultureTypes.AllCultures & ~CultureTypes.NeutralCultures
答案 2 :(得分:1)
我会使用CultureTypes.SpecificCultures,但它没有回答你的问题。
为什么只有世界各国的子集?嗯,有这么多。有人必须维护它们,它确实需要花钱。我认为这就是微软决定只支持最“流行”的原因。
顺便说一句。您可以创建自己的CultureInfo。此外,我还没有尝试过,但您可以通过在构造函数中传递其ISO代码来创建RegionInfo实例。如果没有匹配的CultureInfo,我不确定会发生什么。