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

时间:2010-06-29 09:39:02

标签: c# .net cultureinfo

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

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

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

3 个答案:

答案 0 :(得分:7)

答案是:按设计

CultureInfo.GetCultures 旨在成为世界上所有文化的完整和明确的列表。 旨在为您提供可在计算机上找到的文化。

CultureInfo documentation说:

  

请记住,文化名称和标识符仅代表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,我不确定会发生什么。