从国家/地区名称中获取 ISO 国家/地区代码



有没有办法从国家/地区名称(例如英国 = GB)获取 ISO ALPHA-2 代码(国家/地区代码)?

我正在尝试实现与以下代码几乎相反的目标

//To get the Country Names from the CultureInfo
foreach (CultureInfo cul in CultureInfo.GetCultures(CultureTypes.SpecificCultures))
{    
country = new RegionInfo(new CultureInfo(cul.Name, false).LCID);    
countryNames.Add(country.DisplayName.ToString());    
}

你可以做这样的事情:

var regions = CultureInfo.GetCultures(CultureTypes.SpecificCultures).Select(x => new RegionInfo(x.LCID));
var englishRegion = regions.FirstOrDefault(region => region.EnglishName.Contains("United Kingdom"));
var countryAbbrev = englishRegion.TwoLetterISORegionName;

此类用于收集有关国家和相关文化的信息。

它的构造函数允许您选择是要加载所有可能的国家还是仅加载特定区域性:

CountryList countries = new CountryList([true][false]);

其中true表示CultureTypes.AllCulturesfalse表示CultureTypes.SpecificCultures

例如,使用以下参数:

CountryList countries = new CountryList(true);
List<CountryInfo> countryInfo = countries.GetCountryInfoByName("United States", false);

(true/falseGetCountryInfoByName()的意思是使用/不是本地名称)

此方法返回三个结果:

1 个国家 - 美国
3 文化 - 英语、英语(美国)、西班牙语(美国)

使用本地名称:

List<CountryInfo> countryInfo = Countries.GetCountryInfoByName("United States", true);

1 国家 - 美国
2 文化 - 英语、英语(美国)

具有特定的文化和本地名称:

CountryList countries = new CountryList(false);
List<CountryInfo> countryInfo = countries.GetCountryInfoByName("United States", true);

1 国家 - 美国
1 文化 - 英语(美国)

与您的问题更相关,此类公开了这些方法:

string twoLettersName = countries.GetTwoLettersName("United States", true);

退货US

string threeLettersName = countries.GetThreeLettersName("United States", true);

返回USA

List<string> ietfTags = countries.GetIetfLanguageTag("United States", true);

退货en-US

List<int> geoIds = countries.GetRegionGeoId("United States", true);

退货244

public class CountryList {
private CultureTypes cultureType;
public CountryList(bool AllCultures)
{
cultureType = AllCultures ? CultureTypes.AllCultures : CultureTypes.SpecificCultures;
Countries = GetAllCountries(cultureType);
}
public List<CountryInfo> Countries { get; set; }
public List<CountryInfo> GetCountryInfoByName(string CountryName, bool NativeName)
{
return NativeName ? Countries.Where(info => info.Region?.NativeName == CountryName).ToList()
: Countries.Where(info => info.Region?.EnglishName == CountryName).ToList();
}
public List<CountryInfo> GetCountryInfoByName(string CountryName, bool NativeName, bool IsNeutral)
{
return NativeName ? Countries.Where(info => info.Region?.NativeName == CountryName &&
info.Culture?.IsNeutralCulture == IsNeutral).ToList()
: Countries.Where(info => info.Region?.EnglishName == CountryName &&
info.Culture?.IsNeutralCulture == IsNeutral).ToList();
}
public string? GetTwoLettersName(string CountryName, bool NativeName)
{
CountryInfo? country = NativeName ? Countries.Where(info => info.Region?.NativeName == CountryName).FirstOrDefault()
: Countries.Where(info => info.Region?.EnglishName == CountryName).FirstOrDefault();
return country?.Region?.TwoLetterISORegionName;
}
public string? GetThreeLettersName(string CountryName, bool NativeName)
{
CountryInfo? country = NativeName ? Countries.Where(info => info.Region?.NativeName == CountryName).FirstOrDefault()
: Countries.Where(info => info.Region?.EnglishName == CountryName).FirstOrDefault();
return country?.Region?.ThreeLetterISORegionName;
}
public List<string?>? GetIetfLanguageTag(string CountryName, bool UseNativeName)
{
return UseNativeName ? Countries.Where(info => info.Region?.NativeName == CountryName)
.Select(info => info.Culture?.IetfLanguageTag).ToList()
: Countries.Where(info => info.Region?.EnglishName == CountryName)
.Select(info => info.Culture?.IetfLanguageTag).ToList();
}
public List<int?>? GetRegionGeoId(string CountryName, bool UseNativeName)
{
return UseNativeName ? Countries.Where(info => info.Region?.NativeName == CountryName)
.Select(info => info.Region?.GeoId).ToList()
: Countries.Where(info => info.Region?.EnglishName == CountryName)
.Select(info => info.Region?.GeoId).ToList();
}
private static List<CountryInfo> GetAllCountries(CultureTypes cultureTypes)
{
List<CountryInfo> countries = new List<CountryInfo>();
foreach (CultureInfo culture in CultureInfo.GetCultures(cultureTypes)) {
if (culture.LCID != 127)
countries.Add(new CountryInfo() {
Culture = culture,
Region = new RegionInfo(culture.TextInfo.CultureName)
});
}
return countries;
}
}
public class CountryInfo {
public CultureInfo? Culture { get; set; }
public RegionInfo? Region { get; set; }
}

您可以使用我的软件包Nager.Country.我有一个功能可以使此过程变得容易。也可以搜索带有西班牙语名称的国家,例如"Reino Unido">

PM> install-package Nager.Country
ICountryProvider countryProvider = new CountryProvider();
var countryInfo = countryProvider.GetCountryByName("United Kingdom");
//countryInfo.Alpha2Code = GB

在上面,您只从"国家"中删除了显示名称... 您还应该能够从该国家/地区值中获取代码,因为您正在遍历每个区域性并从区域性名称中获取国家/地区。

与其列出名称,为什么不制作一个字典(代码,显示名称)?

您可以轻松地从键(代码)中查找值(显示名称)或从值(显示名称)中查找键(代码),并且您只能维护 1 个集合。

相关内容

最新更新