Подтвердить строку в отношении сокращений штата USPS

Мне нужно иметь возможность проверять строку против списка возможных сокращений государственных почтовых служб Соединенных Штатов, и Google не предлагает мне никаких указаний.

Я знаю о явном решении: это код ужасного огромного оператора if (или switch) для проверки и сравнения со всеми 50 состояниями, но я спрашиваю StackOverflow, так как это должен быть более простой способ сделать это, Есть ли какой-либо RegEx или объект перечислителя, который я мог бы использовать, чтобы быстро сделать это наиболее эффективным способом?

[С# и .net 3.5 кстати]

Список сокращений штата USPS

Ответ 1

Мне нравится что-то вроде этого:

private static String states = "|AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY|";

public static bool isStateAbbreviation (String state)
{
  return state.Length == 2 && states.IndexOf( state ) > 0;
}

Этот метод имеет преимущество в использовании оптимизированной системной процедуры, которая, вероятно, использует одну машинную инструкцию для выполнения поиска. Если бы я имел дело с нефиксированными длинными словами, я бы проверял на "|" + состояние + "|" чтобы я не ударил подстроку вместо полного соответствия. Это потребовало бы немного больше времени из-за конкатенации строк, но это все равно будет соответствовать фиксированному количеству времени. Если вы хотите проверить аббревиатуры в нижнем регистре, а также в верхнем регистре, то либо проверьте состояние .UpperCase(), либо удвойте строку "states", чтобы включить варианты нижнего регистра.

Я гарантирую, что это каждый раз будет бить запросы Regex или Hashtable, независимо от того, сколько вы запускаете, и будет иметь наименьшее использование памяти.

Ответ 2

Я бы заполнил хэш-таблицу допустимыми сокращениями и затем проверил ее с помощью ввода для проверки. Он намного чище и, вероятно, быстрее, если у вас есть более одной проверки на сборку словаря.

Ответ 3

A HashSet <string> - самый чистый способ, с помощью которого я могу использовать встроенные типы в .NET 3.5. (Вы также можете легко сделать его нечувствительным к регистру или изменить его в Словарь < string, string > , где значение - полное имя. Это также было бы наиболее подходящим решением для .NET 2.0/3.0.)

Что касается скорости - вы действительно считаете, что это будет узким местом в вашем коде? HashSet, скорее всего, выполнит "очень хорошо" (много миллионов поисковых запросов в секунду). Я уверен, что альтернативы будут еще быстрее - но грязнее. Я придерживаюсь простейшей вещи, которая работает, пока у вас не будет оснований полагать, что это будет узким местом.

(Отредактировано для явного упоминания словаря <, > .)

Ответ 4

Здесь существует регулярное выражение. Наслаждайтесь!

^(?-i:A[LKSZRAEP]|C[AOT]|D[EC]|F[LM]|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEHINOPST]|N[CDEHJMVY]|O[HKR]|P[ARW]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$