为什么不在CultureInfo.GetCultures()中展示所有国家/地区?

我使用此标准代码填充国家/地区列表:

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; } } } 

我看到一些国家被遗漏了。 只是想知道这种情况的原因是什么?

答案是:按设计

CultureInfo.GetCultures 并非旨在成为世界上所有文化的完整和明确的列表。 它只是为了让您了解可以在计算机上找到的文化。

CultureInfo文档说:

请记住,文化名称和标识符仅代表可在特定计算机上找到的文化子集 。 Windows版本或Service Pack可以更改可用的文化。 应用程序使用CultureAndRegionInfoBuilder类添加自定义文化。 用户使用Microsoft Locale Builder工具添加自己的自定义文化。 Microsoft Locale Builder使用CultureAndRegionInfoBuilder类以托管代码编写。


笔记

MSDN上可能有用的链接:

  • 预定义的RegionInfo列表 : http : //msdn.microsoft.com/en-us/library/system.globalization.regioninfo( VS.80) .aspx
  • 如何创建自定义文化 : http : //msdn.microsoft.com/en-us/library/ms172469( VS.80) .aspx

顺便说一句,您可以使用简单的LINQ’命令’缩短代码:

 var regionInfos = CultureInfo.GetCultures(CultureTypes.SpecificCultures) .Select(c => new RegionInfo(c.LCID)) .Distinct() .ToList(); 

你没有得到所有的文化:

 CultureTypes.AllCultures & ~CultureTypes.NeutralCultures 

我会使用CultureTypes.SpecificCultures但它不回答你的问题。

为什么只有世界各国的子集? 嗯,有这么多。 有人必须维护它们,它确实需要花钱。 我认为这就是微软决定只支持最“流行”的原因。

BTW。 您可以创建自己的CultureInfo。 此外,我还没有尝试过,但您可以通过在构造函数中传递其ISO代码来创建RegionInfo实例。 我不确定如果没有匹配的CultureInfo会发生什么。