从国家名称获取ISO国家代码

10

有没有一种方法可以从国家名称(例如United Kingdom = 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());    
 }
4个回答

15

您可以像这样做:

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;

8

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

它的构造函数允许您选择是加载所有可能的国家还是只加载特定的文化:

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

true 表示 CultureTypes.AllCultures,false 表示 CultureTypes.SpecificCultures。

例如,使用这些参数:

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

(在 GetCountryInfoByName() 中的 true/false 意味着使用/不使用本地名称)

该方法返回三个结果:

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

返回美国

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

返回美国
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; }
}

1
你可以使用我的包Nager.Country。我有一个功能可以使这个过程变得简单。同时也可以通过西班牙语名称搜索国家,例如“Reino Unido”。
PM> install-package Nager.Country

ICountryProvider countryProvider = new CountryProvider();
var countryInfo = countryProvider.GetCountryByName("United Kingdom");

//countryInfo.Alpha2Code = GB

0

在上面的代码中,你只是从“country”中剥离了DisplayName... 既然你正在循环遍历每个文化,并从文化名称获取国家,那么你应该也能从该国家值中获取代码。

为什么不将名称列表改为(code, DisplayName)的字典呢?

你可以轻松地通过键(代码)查找值(显示名称),或者通过值(显示名称)查找键(代码),并且你可以获得维护一个集合的好处。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接