Название страны по коду ISO 3166-2
Я знаю, как преобразовать код ISO 3166-2 в полное английское имя, например, "US" в "United States", используя RegionInfo
,
Тем не менее, как я могу сделать обратное, то есть, что берет "Соединенные Штаты" и возвращает "США"?
4 ответа
Решение
//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);
Основная идея: взять все объекты региона и выбрать из них тот, который содержит заданное полное имя.
var regionFullNames = CultureInfo
.GetCultures( CultureTypes.SpecificCultures )
.Select( x => new RegionInfo(x.LCID) )
;
var twoLetterName = regionFullNames.FirstOrDefault(
region => region.EnglishName.Contains("United States")
);
Вы можете просто сделать что-то вроде этого:
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 ;
}
}
/// <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;
}