Как получить название страны

Я использовал приведенный ниже код, чтобы получить список типов культуры, есть ли способ получить только название страны?

Спасибо

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

Пример вывода:

Испанский (Пуэрто-Рико)

испанский (США)


person xscape    schedule 07.09.2010    source источник


Ответы (6)


Ну, это регулярное выражение, кажется, делает работу в большинстве случаев:

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);
}
person Édgar Sánchez Gordón    schedule 07.09.2010
comment
DisplayName дает такие названия, как немецкий, каталанский, финский и т. д. Это не совсем названия стран. В противном случае мы можем использовать DisplayName или EnglishName. - person Sidharth Panwar; 07.09.2010
comment
В большинстве случаев DisplayName включает название страны/региона, заключенное в круглые скобки, это последняя часть, которую мы получаем с помощью регулярного выражения. Немного хака, но работает :-) - person Édgar Sánchez Gordón; 07.09.2010
comment
Отображаемое имя не является страной - person Jurion; 20.03.2018

Вы можете использовать свойство Name объекта CultureInfo для создания RegionInfo. Затем вы можете использовать свойство DisplayName. Пытаться:

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

// 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");
person Anapsidae    schedule 06.03.2014
comment
Использование Keys.ToList().Contains() — плохая идея, так как это делает алгоритм O (n ^ 2). Почему бы просто не использовать containsKey()? - person jbindel; 07.03.2014

это будет то, что вы ищете:

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

Вам нужно будет использовать следующие пространства имен

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"));
}
person Jar Yit    schedule 12.06.2015

Вы можете использовать мой пакет 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);
}
person Tino Hager    schedule 13.12.2020