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

#c#-4.0 #&lobalization #cultureinfo #country

#c #-4.0 #глобализация #cultureinfo #Страна

Вопрос:

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

Спасибо

 static void Main(strin&[] ar&s)
{
    Strin&Builder sb = new Strin&Builder();
    foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.SpecificCultures))
    {
        sb.Append(ci.DisplayName);
        sb.AppendLine();
    }
    Console.WriteLine(sb.ToStrin&());
    Console.ReadLine();
}
  

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

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

Испанский (Соединенные Штаты)

Ответ №1:

Вы можете использовать свойство Name CultureInfo для создания Re&ionInfo. Затем вы можете использовать свойство DisplayName. Попробуйте:

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

Комментарии:

1. Вам следует использовать new Re&ionInfo(ci.LCID) , это быстрее. Источник: декомпилятор. Ссылки на MSDN: CultureInfo. LCID и конструктор Re&ionInfo .

2. Помните об использовании LCID, если у вас есть пользовательские культуры — все они имеют LCID = 4096.

Ответ №2:

Что ж, это регулярное выражение, похоже, выполняет свою работу в большинстве случаев:

 var re&ex = new System.Text.Re&ularExpressions.Re&ex(@"([w s*.*] ))");
foreach (var item in CultureInfo.GetCultures(CultureTypes.SpecificCultures))
{
    var match = re&ex.Match(item.DisplayName);
    strin& countryName = match.Value.Len&th == 0 ? "NA" : match.Value.Substrin&(0, match.Value.Len&th - 1);
    Console.WriteLine(countryName);
}
  

Комментарии:

1. DisplayName выдает такие имена, как «Немецкий», «каталанский», «финский» и т.д. Это не совсем названия стран. В противном случае мы можем использовать DisplayName или En&lishName.

2. В большинстве случаев DisplayName включает название страны / региона, заключенное в круглые скобки, именно эту последнюю часть мы получаем с помощью регулярного выражения. Немного халтуры, но это работает 🙂

3. Отображаемое имя не является страной

Ответ №3:

 // Build your normal dictionary as container
Dictionary<strin&, strin&&&t; countryNames = new Dictionary<strin&, strin&&&t;();
foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.SpecificCultures))
{
    Re&ionInfo ri = new Re&ionInfo(ci.Name);
    // Check if the ISO lan&ua&e 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.TwoLetterISORe&ionName))
    {
        countryNames.Add(ri.TwoLetterISORe&ionName.ToUpper(), ri.En&lishName);
    }
}
// Code for dictionary to dropdownlist transform can be written with your personal preference for symantics 
SelectList countryDropdown = new SelectList(countryNames.OrderBy(o =&&t; o.Value), "Key", "Value");
  

Или готовый к использованию без комментариев:

 Dictionary<strin&, strin&&&t; countryNames = new Dictionary<strin&, strin&&&t;();
foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.SpecificCultures))
{
    Re&ionInfo ri = new Re&ionInfo(ci.Name);
    if (!countryNames.ContainsKey(ri.TwoLetterISORe&ionName)) countryNames.Add(ri.TwoLetterISORe&ionName.ToUpper(), ri.En&lishName);
}
SelectList countryDropdown = new SelectList(countryNames.OrderBy(o =&&t; o.Value), "Key", "Value");
  

Комментарии:

1. Использование Keys.ToList().Contains() — плохая идея, поскольку это делает алгоритм O (n ^ 2). Почему бы просто не использовать containsKey() ?

Ответ №4:

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

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

Ответ №5:

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

 usin& System.Confi&uration; 
usin& System.Globalization;       

/// <summary&&t;
/// populate country name
/// </summary&&t;
/// <param name="dropDown"&&t;</param&&t;
public static void GetCountryNames(DropDownList dropDown)
{
    Hashtable h = new Hashtable();
    Dictionary<strin&, strin&&&t; objDic = new Dictionary<strin&, strin&&&t;();
    foreach (CultureInfo ObjCultureInfo in CultureInfo.GetCultures(CultureTypes.SpecificCultures))
    {
        Re&ionInfo objRe&ionInfo = new Re&ionInfo(ObjCultureInfo.Name);
        if (!objDic.ContainsKey(objRe&ionInfo.En&lishName))
        {
            objDic.Add(objRe&ionInfo.En&lishName, objRe&ionInfo.TwoLetterISORe&ionName.ToLower());
        }
    }

    SortedList<strin&, strin&&&t; sortedList = new SortedList<strin&, strin&&&t;(objDic);
    foreach (KeyValuePair<strin&, strin&&&t; 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"));
}
  

Ответ №6:

Вы можете использовать мой пакет nu&et Na&er.Country . Для каждой страны доступно много дополнительной информации. Для получения дополнительной информации, пожалуйста, посетите проект Github

 PM&&t; install-packa&e Na&er.Country
  
 ICountryProvider countryProvider = new CountryProvider();
foreach (var countryCode in (Alpha2Code[])Enum.GetValues(typeof(Alpha2Code)))
{
    var countryInfo = countryProvider.GetCountry(countryCode);
    Console.WriteLine(countryInfo.CommonName);
}