如何代表美国国家名单

时间:2010-09-11 02:20:27

标签: c# asp.net nunit fluentvalidation

尝试针对FluentValidation进行TDD并寻找表示美国国家列表的正确方法。

例如,我有一个“地址”对象。

我想写一个测试(和FluentValidation规则),如果它不在美国国家列表中,则声明该地址无效。

这是一个有限的列表,仅包含50个美国国家,所以我认为它应该是一个常数并且不在数据库中表示。

我想知道的是,存储和验证/测试的最有效方法是什么?枚举,数组,列表对象,什么?

2 个答案:

答案 0 :(得分:2)

使用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 :(得分: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(例如全名,缩写,允许日期等)。

使用最简单的格式。

希望这有帮助。