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.
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 ?
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
Niestety nie znajdziesz na tej liście wszystkich krajów.
np. San Marino, Watykan
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.