15

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

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

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

4

3 回答 3

8

答案是:设计

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

CultureInfo 文档说:

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


笔记

MSDN 上可能有用的链接:

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

var regionInfos = CultureInfo.GetCultures(CultureTypes.SpecificCultures)
  .Select(c => new RegionInfo(c.LCID))
  .Distinct()
  .ToList();
于 2014-04-02T10:10:05.977 回答
2

你没有得到所有的文化:

CultureTypes.AllCultures & ~CultureTypes.NeutralCultures
于 2010-06-29T09:43:06.997 回答
1

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

为什么世界上只有一部分国家?好吧,他们有很多。必须有人维护它们,而且确实要花钱。我认为这就是为什么微软决定只支持最“流行”的。

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

于 2010-09-07T16:42:00.110 回答