1
I have some class:

public class AddressViewModel
{
    public string Index { get; set; }
    public string Area { get; set; }
    public string StreetName { get; set; }
    public string Home { get; set; }
    ...
}

string specialCharacters = @"~!@#$%^&*_+|{}:""<>?[];'/=\№";   

我有检查方法:

    private bool CompareCharacters(string specialCharacters, AddressViewModel x)
    {
        if (x.Index.Any(specialCharacters.Contains) || 
            x.Area.Any(specialCharacters.Contains) || ...) 
           return false;
        else
           return true;
    }

如何重构此方法?我不喜欢“if”语句的实现

4

2 回答 2

4

好吧,您可以从一个 return 语句开始:

private bool ValidateCharacters(string specialCharacters, AddressViewModel x)
{
    return !x.Index.Any(specialCharacters.Contains) &&
           !x.Area.Any(specialCharacters.Contains);
}

需要specialCharacters在呼叫之间变化吗?如果没有,您可以将其作为参数删除,并只拥有一个私有常量字段。您可能还想提取一个私有方法来比较单个字符串,这样您就可以调用:

private bool ValidateCharacters(string specialCharacters, AddressViewModel x)
{
    return ValidateCharacters(x.Index) &&
           ValidateCharacters(x.Area);
}

或者,如果您有很多字符串,您甚至可以(以轻微的性能开销)创建一个带有params参数的方法,并使用:

private bool ValidateCharacters(string specialCharacters, AddressViewModel x)
{
    return ValidateCharacters(x.Index, x.Area, x.StreetName, x.Home, ...);
}
于 2013-08-20T12:19:55.747 回答
2

据我了解您的问题,您希望的行为是检查您的属性是否包含 specialCharacters 字符串中的任何字符。如果不是这样,我很抱歉......

无论如何,我会为此目的使用正则表达式。您在 specialCharacters 中列出的大多数字符都应该转义为正则表达式。所以代码看起来像:

string specialCharacters = @"\~|!|\@|\#|\$|%|\^|\&|\*|_|\+|\||\{|\}|:\""|\<|\>|\?|\[|\]|;|'|/|=|\\|№";

public bool ValidateCharacters(string pattern, AddressViewModel model)
{
    var reg = new Regex(pattern);

    return reg.IsMatch(model.Index) == false && reg.IsMatch(model.Area) == false;
}

我对名称做了一些重构,我宁愿让这个方法成为 AddressViewModel 的成员函数。此外,还有很多关于 .Net 框架支持的验证的很好的文章,例如this

于 2013-08-20T12:47:25.027 回答