2015-06-12 5 views
0

У меня есть список двухбуквенных кодов стран ISO 3166, полученных из внешнего источника. Для каждого, я создаюSystem.Globalization.RegionInfo полный список допустимых входных данных культуры

 new System.Globalization.RegionInfo(countryCode) 

и иногда один недействителен приводит к ArgumentException «Имя культуры„XX“не поддерживается.»

Мне нужна функция, чтобы определить, действителен ли код страны, прежде чем передавать его в конструктор. Это моя попытка:

private bool IsCultureValid(string cultureName) 
    { 
     return CultureInfo.GetCultures(CultureTypes.AllCultures) 
      .Any(c => c.Name.Equals(cultureName, StringComparison.InvariantCultureIgnoreCase)); 
    } 

Функция возвращает Ложноотрицательную для многих входов (функция возвращает ложь, но я могу создать объект RegionInfo с этим входом, если я попробую). Некоторые входы:

  • ZW (Зимбабве)
  • а.е. (Австралия)
  • тх (Мексика)
  • Ve (Боливарианская Республика Венесуэла)
  • кп (Гондурас)
  • кВт (Кувейт)

Что мне не хватает? Есть ли лучший подход здесь? Заранее спасибо!

ответ

1

Я понимаю, что это датированный вопрос. Тем не менее, я недавно столкнулся с аналогичной ситуацией, когда мне нужно было проверить входящие коды кодов ISO. Все примеры, которые я мог найти здесь и в других местах, основывались на обнаружении исключения, которое было создано при попытке создать регион или культуру с недопустимым кодом/id. Это не очень хорошая практика.

Мое собственное исследование проблемы привело меня к пониманию того, что в основном проблема заключалась в инвариантной культуре и нейтральных культурах. Как только они удаляются из массива CultureInfo, можно сгенерировать список только действительных объектов RegionInfo.

Это экстраполяция из моей собственной проблемы, чтобы предоставить запрошенный ответ. Хотя очевидно, что это изменение может быть применено везде, где вам нужны только действительные объекты RegionInfo.

private bool IsValidRegion(string isoCountryCode) 
    { 
     return CultureInfo.GetCultures(CultureTypes.AllCultures) 
      .Where(x => !x.Equals(CultureInfo.InvariantCulture)) //Remove the invariant culture as a region cannot be created from it. 
      .Where(x => !x.IsNeutralCulture) //Remove nuetral cultures as a region cannot be created from them. 
      .Select(x => new RegionInfo(x.LCID)) 
      .Any(x => x.Name.Equals(isoCountryCode, StringComparison.InvariantCulture)); 
    } 

Edit: Если только с помощью пользовательских культур это действительно может быть сделано еще более непосредственно. Просто используйте значение перечисления «CultureTypes.SpecificCultures».

1

Вы можете написать функцию, которая создает определенную культуру внутри блока try/catch и вернуть объект CultureInfo вместо bool.

К сожалению, такой культуры, как ve, это es-VE и т. Д. Для Мексики, Гондураса. Культурная информация для «производных» культур должна иметь родительский код культуры раньше. ан-AU, ан-США, и так далее

http://www.localeplanet.com/dotnet/es-VE/index.html

Чтобы получить список всех правильных значений, установленных культур, использование:

CultureInfo.GetCultures(); 

https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.getcultures(v=vs.110).aspx

+0

Это будет работать. Но он использует исключения для ожидаемого потока логики, что является ужасной практикой и ужасно для производительности системы реального времени (требуется здесь) – Kenn

+0

@ Kenn Я согласен, но нет другого способа, когда вы должны ретранслировать во внешний список данных для создания конкретных культур с неправильными кодами. Вы не можете просто предположить, что они правы. Вы думаете о лучшем решении? – Oscar

+0

Просто кажется, что разрыв здесь в том, что я использую CultureInfo для получения списка входов RegionInfo. Не могу не подумать, что у меня отсутствует очевидное решение в другой части CLR? В худшем случае я могу сделать try/catch и кэшировать результат, я полагаю. – Kenn

-1

Вы получаете ложные потому что их не существует. Вот список всех культур, полученных с помощью следующего цикла:

foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.AllCultures)) 
{ 
    ci.Name 
} 

соток, Б.Г., ч, ж-Ганс, CS, да, де, эль, еп, эс, фи, фр, он, ху, есть она, Ja, ко, п нет, пл, пт, гт, ро, ру, час, ск, кв, св, е, т, ур, идентификатор, ик, быть С.Л., и др, лев, л, ТГ, фа, VI, хй, аги, ес, HSB, ки, т, XH, ца, аф, ка, FO, привет, м, как таковой, га, мс, кк, KY, SW, ки, UZ, тт, млрд, ра, гу, или, тот, т.й, кп, мл, в, г, са, млн, бы, су, км, с, Г.Л., кок, Syr, си, IU, аты, ПЗМ, п, FY, пс, фил, DV, ха, уо, QUZ, NSO, ба, фунты, кл, И.Г., II, ARN, MoH, шир ,, мкг, ми, ос, со, GSW, сах, QUT, RW, WO , PRS, Gd, ар-SA, BG-BG, CA-ES, ZH-TW, CS-CZ, да-DK, де-DE, эль-GR, EN-US, FI-FI, FR-FR, он -IL, HU-HU, IS-IS, он-IT, JA-JP, ко-KR, NL-NL, NB-NO, PL-PL, PT-BR, RM-СН, ро-ро, ру-RU , ч-HR, SK-SK, кв-AL, SV-SE, е-TH, TR-TR, ур-ПК, идентификатор ID-, ик-UA, будь-BY, SL-СИ, ET-EE, LV -LV, LT-LT, TG-Cyrl-т, фа-ИК, VI-В.Н., HY-AM, аз-Latn-AZ, ес-ES, HSB-ДЕ, тк-МК, т-З, XH-З.А. , ца-ZA, аф-ZA, ка-GE, FO-FO, привет-В, м-МТ, SE-НЕТ, мс-MY, кк-KZ, KY-КГ, SW-КА, ки-ТМ, UZ-Latn-UZ, TT-RU, Bn-IN, PA-в, гу-в или в-, та-в, т е-в, KN-IN, мл-IN, а-IN, MR-IN, SA-IN, MN-MN, BO-CN, родный GB, км-KH, вот-LA, ГЛ-ES, кок-IN, Syr-SY, си-ЛК, IU-Стаканчики-CA, я-ET, пе-NP, FY-NL, пс-AF, филь- PH, DV-МВ, ха-Latn-NG, уо-NG, QUZ-БО, NSO-З, ба-RU, фунт-LU, KL-GL, IG-NG, II-CN, ARN-CL, moh- CA, уш-FR, UG-CN, ми-NZ, осы-FR, со-FR, GSW-FR, с-RU, кут-GT, RW-RW, горе-SN, PRS-AF, Г.Д.-GB, ар-IQ, ZH-CN, де-СН, ан-GB, ES-MX, FR-BE, он-СН, п-BE, пп-НЕТ, PT-PT, SR-Latn-CS, св-Fi, аз-Cyrl-АЗ, DSB-DE, SE-SE, га-IE, MS-BN, UZ-Cyrl-UZ, млрд-BD, млн-Монг-CN, Iu-Latn-СА, ПЗМ-Latn-ДЗ, QUZ-EC, ар-EG, ж-HK, де-AT, ан-AU, эс-ES, FR-CA, стер Cyrl-CS, SE-FI, QUZ-PE, ар-LY, ж-SG, де-LU, ан-CA, ES-GT, FR-СН, ч-BA, SMJ-НЕТ, ар-ДЗ, ZH-МО, DE-LI, ан-NZ, ES-CR, FR-LU, BS- Latn-BA, SMJ-SE, ар-МА, ан-IE, ES-PA, FR-МС, SR-Latn-BA, сма-НЕТ, ар-Т.Н., ан-З, ES-DO, SR-Cyrl- Б.А., сма-SE, ар-ОМ, ан-JM, ES-VE, шс-Cyrl-BA, SMS-Fi, ар-Ю.Е., ан-029, ES-СО, SR-Latn-RS, SMN-Fi, ар-С.Ю., ан-BZ, ES-РЕ, SR-Cyrl-RS, ар-JO, ан-TT, ES-AR, SR-Latn-М, ар-ЛБ, ан-ZW, ES-КИ, SR- Cyrl-ME, ар-KW, еп-PH, эс-CL, ар-AE, эс-UY, ар-BH, эс-PY, ар-QA, еп-IN, эс-BO, ан-М.Ю., эс-СВ, еп-SG, эс-HN, эс-NI, эс-PR, эс-США, бс-Cyrl, BS- Latn, ср-Cyrl, SR-Latn, SMN, аз-Cyrl, SMS, ж, пп, бс, аз-Latn, сма, UZ-Cyrl, млн-Cyrl, Iu-Стаканчики ZH-Hant, Nb, Sr, tg-Cyrl, dsb, smj, uz-Latn, mn-Mong, iu-Latn, tzm-Latn, ha-Latn, zh-CHS, zh-CHT

Итак, вы можете видеть, что он не содержит zw, но он имеет en-ZW аналогично для au it en-AU

+0

Я думаю, вы неправильно поняли вопрос. Функция возвращает «false negative», а не просто «функция возвращает false». Таким образом, проблема в том, что в RegionInfo есть допустимые данные, которые отсутствуют в списке, который вы указали. Кажется, что нет способа получить полный список двухбуквенных ИСО 3166 для страны/регионов, которые принимаются RegionInfo. – Kenn