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

alw*_*NET 5 c#

有没有办法从国家名称(例如英国 = 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());    
 }
Run Code Online (Sandbox Code Playgroud)

ika*_*ine 10

你可以这样做:

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;
Run Code Online (Sandbox Code Playgroud)


Jim*_*imi 8

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

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

CountryList countries = new CountryList([true][false]);
Run Code Online (Sandbox Code Playgroud)

true手段CultureTypes.AllCulturesfalse手段在哪里CultureTypes.SpecificCultures

例如,使用这些参数:

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

true/false表示GetCountryInfoByName()使用/不是本机名称)

该方法返回三个结果:

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

使用本机名称:

List<CountryInfo> countryInfo = Countries.GetCountryInfoByName("United States", true);
Run Code Online (Sandbox Code Playgroud)

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

具有特定文化和本土名称:

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

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

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

string twoLettersName = countries.GetTwoLettersName("United States", true);
Run Code Online (Sandbox Code Playgroud)

退货US

string threeLettersName = countries.GetThreeLettersName("United States", true);
Run Code Online (Sandbox Code Playgroud)

退货USA

List<string> ietfTags = countries.GetIetfLanguageTag("United States", true);
Run Code Online (Sandbox Code Playgroud)

退货en-US

List<int> geoIds = countries.GetRegionGeoId("United States", true);
Run Code Online (Sandbox Code Playgroud)

退货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; }
}
Run Code Online (Sandbox Code Playgroud)