国家/地区名称为ISO 3166-2代码
我知道如何使用RegionInfo
将ISO 3166-2代码转换为完整的英文名称,例如“US”到“United States”。
但是,我怎么能做相反的事情,即拿“美国”并返回“美国”?
//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") );
/// /// English Name for country /// /// /// /// Returns: RegionInfo object for successful find. /// Returns: Null if object is not found. /// 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; }
你可以做这样的事情:
class CountryCodeMap { private static Dictionary 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 ; } }