2010-09-11 3 views
4

Пытается сделать TDD против FluentValidation и искать подходящий способ представления списка штатов США.как представлять список штатов США

Например, у меня есть объект «Адрес».

Я хотел бы написать тест (и правило FluentValidation), объявляющее адрес недействительным, если его нет в списке штатов США.

Это конечный список, включающий только 50 штатов США, поэтому я считаю, что он должен быть чем-то постоянным и не представлен в базе данных.

Что мне интересно, что является самым эффективным способом хранения и проверки/проверки на это? Перечисление, массив, объект списка, что?

+0

некоторые подсказки: не дублируйте теги типа «C#» в ваших заголовках. Просто оставьте их в тегах. Кроме того, пожалуйста, оставьте «Привет», «Спасибо» и т. Д. Это сайт вопросов и ответов, а не дискуссионный форум. –

+0

Другие действующие адреса США, чем 50 государств. Вашингтон, округ Колумбия, например. Также в Пуэрто-Рико. Просмотрите полный список из USPS: http://www.usps.com/ncsc/lookups/usps_abbreviations.html. –

ответ

1

Я бы с сохранением их в постоянном массиве строк ...

//Define the constant array 
const String[] TheStates = new String[] { "Alabama", "Arizona", ... }; 

//fluentvalidation rule 
RuleFor(address => address.State).Must(theState => TheStates.Contains(theState)); 

Держа их в Enum потребуют некоторой связи между именем государства и целым значением - это просто не звучит как эффективный. Или вам нужно будет много использовать ToString() или создать какой-то пользовательский атрибут для каждого элемента в вашем перечислении (я видел несколько примеров этого, но тогда вы имеете дело с отражением, которое не так впечатляет).

Я бы рассмотрел List, только если вам нужны дополнительные данные с каждым состоянием (например, полное имя, аббревиатура, дата и т. Д.).

Пойдите с простейшим форматом, который вы можете.

Надеюсь, это поможет.

+0

Первая строка примера не будет работать в C#. Вы получите эту ошибку: ** Поле const ссылочного типа, отличное от строки, может быть инициализировано только нулевым значением. ** – code4life

2

Используйте массив static readonly или HashSet.

Состояние может быть представлено его полным именем или его аббревиатурой. Вы хотите проверить оба? Кроме того, состояние может быть проверено почтовым индексом (я не уверен, что вы хотите это сделать).

Вы могли бы иметь статический только для чтения одного массива или HashSet, содержащий как полное имя и аббревиатуру, как это:

public static readonly string[] listOfStates = new string[] 
    { 
     "New York", 
     "NY", 
     // rest of states & abbreviations here... 
    }; 

или

public static readonly HashSet<string> listOfStates = new HashSet<string> 
    { 
     "New York", 
     "NY", 
     // rest of states & abbreviations here... 
    }; 

Оба поддержки Contains синтаксиса:

// Queryable like this: 
bool stateMatch = listOfStates.Contains(stringValue); 
Смежные вопросы