0

任何人都可以帮助填充国家名称列表,其各自的两个字母代码和三个字母代码。我尝试了下面的代码片段,但它给了我不完整的结果。

 static void Main(string[] args)
    {
        List<string> list = new List<string>();
        foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.AllCultures & ~CultureTypes.NeutralCultures))
        {
            try
            {
                RegionInfo myRI1 = new RegionInfo(ci.LCID);
                list.Add(String.Format("{0,-12}{1,-12}{2}", myRI1.TwoLetterISORegionName, myRI1.EnglishName, myRI1.ThreeLetterISORegionName));
            }
            catch { }
       }

    list.Sort();  // sort by name
        // write to console
    foreach (string str in list)
        Console.WriteLine(str);

    Console.WriteLine("Total Countries" + list.Count.ToString());
    Console.ReadKey();
    }
}
4

1 回答 1

2

如果您真的必须使用 C# 检索此信息,我会这样做:

var regions = CultureInfo.GetCultures(CultureTypes.AllCultures)
    .Where(c => !c.IsNeutralCulture && c.LCID != 0x7f)
    .Select(c => new RegionInfo(c.LCID))
    .GroupBy(r => r.TwoLetterISORegionName) // This is an alternative to using Distinct
    .Select(g => g.First())                 // It's probably not very efficient, but the list is so small anyway.
    .OrderBy(r => r.TwoLetterISORegionName)
    .ToList();

(LCID 为 0x7f 的区域性是InvariantCulture,它没有关联的 RegionInfo。)

这在我的计算机上只提供了 127 个国家/地区。您的方法提供了更多的结果,因为有许多 multiple 的实例CultureInfos共享相同的RegionInfo. 例如,有四种不同CultureInfos的指向RegionInfo西班牙:(ca-ES加泰罗尼亚语)、eu-ES(巴斯克语)、gl-ES(加利西亚语)和es-ES(西班牙语)。这是因为CultureInfo主要关注语言,语言和地区不需要匹配。

世界上有超过127个国家。问题在于,通过使用CultureInfo并且RegionInfo只能告诉您计算机碰巧知道的国家/地区来解决此问题,这不太可能是完整的列表。而且,RegionInfo顾名思义,它们甚至不一定是国家或民族。例如,RegionInfo我计算机上的条目之一是“加勒比”,其 TwoLetterISORegionName 为029(我不得不承认这很奇怪)。加勒比显然不是一个国家。

解决问题的更好方法是在其他地方查找国家/地区列表,例如在这里,并将它们存储在程序中某处的表格中。

于 2013-07-30T13:24:09.587 回答