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 フレームワークでサポートされている検証に関する非常に優れた記事があります。たとえば、この.

于 2013-08-20T12:47:25.027 に答える