2014-12-24 10 views
4

Я знаю, как преобразовать код ISO 3166-2 в полное английское имя, например. «США» в «Соединенные Штаты», используя RegionInfo.Название страны по ISO 3166-2 код

Однако, как я могу сделать обратное, то есть принимать «Соединенные Штаты» и возвращает «США»?

+0

Приятно видеть людей, быть полезным, но получение (в основном) тот же ответ в четыре раза довольно ненужным. Счастливого Рождества! – Onots

ответ

10
//Get the cultureinfo 
RegionInfo rInfo = new RegionInfo("us"); 
string s = rInfo.EnglishName; 

//Convert it back 
CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures); 
CultureInfo cInfo = cultures.FirstOrDefault(culture => new RegionInfo(culture.LCID).EnglishName == s); 
1

Основная идея: взять все объекты региона и выбрать из них тот, который содержит полное имя.

var regionFullNames = CultureInfo 
         .GetCultures(CultureTypes.SpecificCultures) 
         .Select(x => new RegionInfo(x.LCID)) 
         ; 
var twoLetterName = regionFullNames.FirstOrDefault(
         region => region.EnglishName.Contains("United States") 
        ); 
1
 /// <summary> 
     /// English Name for country 
     /// </summary> 
     /// <param name="countryEnglishName"></param> 
     /// <returns> 
     /// Returns: RegionInfo object for successful find. 
     /// Returns: Null if object is not found. 
     /// </returns> 
     static RegionInfo getRegionInfo (string countryEnglishName) 
     { 
      //Note: This is computed every time. This may be optimized 
      var regionInfos = CultureInfo.GetCultures(CultureTypes.SpecificCultures) 
       .Select(c => new RegionInfo(c.LCID)) 
       .Distinct() 
       .ToList(); 
      RegionInfo r = regionInfos.Find(
        region => region.EnglishName.ToLower().Equals(countryEnglishName.ToLower()));      
      return r; 
     } 
1

Вы просто могли бы сделать что-то вроде этого:

class CountryCodeMap 
{ 
    private static Dictionary<string,string> map = 
    CultureInfo 
    .GetCultures(CultureTypes.AllCultures) 
    .Where(ci => ci.ThreeLetterISOLanguageName != "ivl") 
    .Where(ci => !ci.IsNeutralCulture) 
    .Select(ci => new RegionInfo(ci.LCID)) 
    .Distinct() 
    .ToDictionary(r => r.Name , r => r.EnglishName) 
    ; 

    public static string GetCountryName(string isoCountryCode) 
    { 
    string countryName ; 
    bool found = map.TryGetValue(isoCountryCode, out countryName) ; 

    if (!found) throw new ArgumentOutOfRangeException("isoCountryCode") ; 

    return countryName ; 
    } 

}