2010-09-07 4 views
15

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

Спасибо

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


    } 

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

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

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

ответ

4

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

 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. –

+0

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

48

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

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

Вы должны использовать ** 'новый RegionInfo (ci.LCID)' **, это быстрее. Источник: декомпилятор. Ссылки на MSDN: [CultureInfo.LCID] (http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.lcid (v = vs.80) .aspx) и [RegionInfo constructor] (http://msdn.microsoft.com/en-us/library/3ftdh74h(v=vs.110).aspx). –

+5

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

0

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

 foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.SpecificCultures)) 
     { 
      sb.Append(ci.EnglishName); 
      sb.AppendLine(); 
     } 
1
// 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(). Содержит()' - плохая идея, так как он делает алгоритм O (n^2). Почему бы просто не использовать 'containsKey()'? – jbindel

+0

Thx @jbindel, я обновил snip :) – Lesage

0
 You will need to use following namespaces 

    using System.Configuration; 
    using System.Globalization;  

///

/// 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")); 

    } 

} 
Смежные вопросы