Krótko, jeżeli potrzebujecie listę krajów dla combobox wystarczy wam taki o to fragment kodu:

public static Dictionary<string, string> GetCountries()
{
    var countries = new Dictionary<string, string>();

    foreach (var cultureInfo in CultureInfo.GetCultures(CultureTypes.AllCultures))
    {
        RegionInfo regionInfo = null;

        try
        {
            regionInfo = new RegionInfo(cultureInfo.LCID);
        }
        catch(Exception)
        {
            continue;
        }

        if (!countries.ContainsKey(regionInfo.TwoLetterISORegionName))
        {
            countries.Add(regionInfo.TwoLetterISORegionName, regionInfo.DisplayName);
        }
    }

    return countries.OrderBy(pair => pair.Value).ToDictionary(pair => pair.Key, pair => pair.Value);
}

W zależności od wartości CultureTypes, liczba zwróconych krajów będzie różna od 110 do 127 (aktualnie na świecie zakłada się, że jest 195 krajów). Zaś jeżeli chodzi o tekst (wartość) to mamy do wyboru:

  • DisplayName – nazwę kraju w języku z lokalizowanego .NET;
  • EnglishName – nazwa kraju w języku angielskim;
  • NativeName – nazwa kraju w języku danego kraju.

Dla chętnych, kluczem może być wartość ThreeLetterISORegionName, jednakże na jej podstawie nie można potem utworzyć obiektu CultureInfo czy RegionInfo.

4 KOMENTARZE

  1. Jakoś mam "uprzedzenia" do konstrukcji tego typu:
    try { … } catch(Exception) { continue; }

    Z czego to wynika ?
    Czyżby nie zawsze udawało się utworzyć RegionInfo na podstawie LCID ?

  2. Hejka,

    Tak, gdyz dla przykladu:
    Culture ID 1 (0x0001) is a neutral culture; a region cannot be created from it.
    Parameter name: culture

    Na przyklad ‘en’ jest natural culture, zas en-GB jest RegionalInfo.

    i cos takiego wystepuje 69 razy dla CultureTypes.AllCultures, zas dla wartosci: CultureTypes.SpecificCultures juz nie wystapi ani razu.

    Ogolnie jak juz wybierzesz sobie CultureTypes to warto sprawdzic czy Exception jest wywolywany i wrazie co wykasowac ten fragment kodu.

    Gutek

  3. A dlaczego zamiast
    try
    {
    regionInfo = new RegionInfo(cultureInfo.LCID);
    }
    catch(Exception)
    {
    continue;
    }

    Nie zrobisz po prostu:
    foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.AllCultures & ~CultureTypes.NeutralCultures))

Comments are closed.