как представить список штатов США - PullRequest
4 голосов
/ 11 сентября 2010

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 11 сентября 2010

Использовать массив static readonly или 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);
1 голос
/ 11 сентября 2010

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

//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, только если вам нужны дополнительные данные для каждого состояния (например, полное имя, аббревиатура, дата допуска и т. Д.).

Используйте самый простой формат, которыйВы можете.

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

...