如何获取国家名称

18
我使用下面的代码获取文化类型列表,是否有办法仅获取国家名称? 谢谢
static void Main(string[] args)
{
    StringBuilder sb = new StringBuilder();
    foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.SpecificCultures))
    {
        sb.Append(ci.DisplayName);
        sb.AppendLine();
    }
    Console.WriteLine(sb.ToString());
    Console.ReadLine();
}

输出样例:

西班牙语(波多黎各)

西班牙语(美国)

6个回答

54
你可以使用CultureInfo的Name属性构造一个RegionInfo。然后你可以使用DisplayName属性。 尝试:

您可以使用CultureInfo的Name属性构造RegionInfo。 然后,您可以使用DisplayName属性。

foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.SpecificCultures))
{
    var ri = new RegionInfo(ci.Name);
    Console.WriteLine(ri.DisplayName);
}

2
你应该使用 **new RegionInfo(ci.LCID)**,它更快。来源:反编译器。在MSDN上的链接:CultureInfo.LCIDRegionInfo构造函数 - Yves M.
5
如果您使用自定义文化,则需要注意使用LCID - 它们的所有LCID都等于4096。 - user3495888

3
// Build your normal dictionary as container
Dictionary<string, string> countryNames = new Dictionary<string, string>();
foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.SpecificCultures))
{
    RegionInfo ri = new RegionInfo(ci.Name);
    // Check if the ISO language code is already in your collection 
    // Because you don't want double entries in a country box because we had to use the culture info
    if (!countryNames.ContainsKey(ri.TwoLetterISORegionName))
    {
        countryNames.Add(ri.TwoLetterISORegionName.ToUpper(), ri.EnglishName);
    }
}
// Code for dictionary to dropdownlist transform can be written with your personal preference for symantics 
SelectList countryDropdown = new SelectList(countryNames.OrderBy(o => o.Value), "Key", "Value");

准备好的代码,可以直接使用而无需注释:
Dictionary<string, string> countryNames = new Dictionary<string, string>();
foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.SpecificCultures))
{
    RegionInfo ri = new RegionInfo(ci.Name);
    if (!countryNames.ContainsKey(ri.TwoLetterISORegionName)) countryNames.Add(ri.TwoLetterISORegionName.ToUpper(), ri.EnglishName);
}
SelectList countryDropdown = new SelectList(countryNames.OrderBy(o => o.Value), "Key", "Value");

2
使用 Keys.ToList().Contains() 是一个不好的想法,因为它会使算法变成 O(n^2)。为什么不直接使用 containsKey() 呢? - jbindel

3

嗯,这个正则表达式在大多数情况下似乎能够完成任务:

var regex = new System.Text.RegularExpressions.Regex(@"([\w+\s*\.*]+\))");
foreach (var item in CultureInfo.GetCultures(CultureTypes.SpecificCultures))
{
    var match = regex.Match(item.DisplayName);
    string countryName = match.Value.Length == 0 ? "NA" : match.Value.Substring(0, match.Value.Length - 1);
    Console.WriteLine(countryName);
}

1
DisplayName 提供类似于 "德语"、"加泰罗尼亚语"、"芬兰语" 等的名称。这些并不完全是国家名称。否则,我们可以使用 DisplayName 或者 EnglishName。 - Sidharth Panwar
在大多数情况下,DisplayName 包括用括号括起来的国家/地区名称,我们使用正则表达式获取最后一部分。这有点像黑客技巧,但它确实有效 :-) - Édgar Sánchez Gordón
显示名称不是国家。 - Jurion

0

这将是您正在寻找的内容:

foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.SpecificCultures))
{
    sb.Append(ci.EnglishName);
    sb.AppendLine();
}

0

您需要使用以下命名空间

using System.Configuration; 
using System.Globalization;       

/// <summary>
/// populate country name
/// </summary>
/// <param name="dropDown"></param>
public static void GetCountryNames(DropDownList dropDown)
{
    Hashtable h = new Hashtable();
    Dictionary<string, string> objDic = new Dictionary<string, string>();
    foreach (CultureInfo ObjCultureInfo in CultureInfo.GetCultures(CultureTypes.SpecificCultures))
    {
        RegionInfo objRegionInfo = new RegionInfo(ObjCultureInfo.Name);
        if (!objDic.ContainsKey(objRegionInfo.EnglishName))
        {
            objDic.Add(objRegionInfo.EnglishName, objRegionInfo.TwoLetterISORegionName.ToLower());
        }
    }

    SortedList<string, string> sortedList = new SortedList<string, string>(objDic);
    foreach (KeyValuePair<string, string> val in sortedList)
    {
        dropDown.Items.Add(new ListItem(val.Key, val.Key));
    }

    dropDown.Items.Insert(0, new ListItem("Select", "Select"));
    dropDown.Items.Insert(1, new ListItem("Other Country", "Other"));
}

0
你可以使用我的NuGet包Nager.Country。每个国家都有很多额外的信息可用。欲了解更多信息,请访问Github项目
PM> install-package Nager.Country

ICountryProvider countryProvider = new CountryProvider();
foreach (var countryCode in (Alpha2Code[])Enum.GetValues(typeof(Alpha2Code)))
{
    var countryInfo = countryProvider.GetCountry(countryCode);
    Console.WriteLine(countryInfo.CommonName);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接