c#如何使用谓词

时间:2016-09-08 14:49:20

标签: c# validation predicates

只看到一个示例代码,其中调用多个函数来执行验证,如果任何一个验证失败,则返回false给调用环境,如果all传递则返回true。

如何在任何验证失败时自定义例程,然后返回错误消息,当所有验证通过时,将返回空字符串。看到我的代码并帮助我使用谓词自定义我想要它的方式。

        private static Predicate<string>[] _checks = new Predicate<string>[]
        {
            ValidationSeries.IsAtLeastFiveChars,
            ValidationSeries.HasASpace,
            ValidationSeries.HasNoLeadingSpace,
            ValidationSeries.HasNoTrailingSpace
        };


private void button1_Click(object sender, EventArgs e)
{
    bool doesPassAllChecks = _checks.All(c => c("Hello Test"));
}

    public static class ValidationSeries
    {
            public static bool IsAtLeastFiveChars(string text)
            {
                return text.Length >= 5;
            }

            public static bool HasASpace(string text)
            {
                return text.Contains(' ');
            }

            public static bool HasNoLeadingSpace(string text)
            {
                return !text.StartsWith(" ");
            }

            public static bool HasNoTrailingSpace(string text)
            {
                return !text.EndsWith(" ");
            }
    }
寻求帮助。感谢

1 个答案:

答案 0 :(得分:0)

这样解决了。

public static class ValidationSeries
    {
        private static Predicate<string>[] _checks = new Predicate<string>[]
        {
                ValidationSeries.IsAtLeastFiveChars,
                ValidationSeries.HasASpace,
                ValidationSeries.HasNoLeadingSpace,
                ValidationSeries.HasNoTrailingSpace
        };

        public static bool Check(string s, ICollection<string> failedPredicateNames)
        {

            var failed = false;
            foreach (var check in _checks)
            {
                if ( !check(s) )
                {
                    failedPredicateNames.Add(check.Method.Name);
                    failed = true;
                }
            }
            return !failed;
        }

        public static bool IsAtLeastFiveChars(string text)
        {
            return text.Length >= 5;
        }

        public static bool HasASpace(string text)
        {
            return text.Contains(" ");
        }

        public static bool HasNoLeadingSpace(string text)
        {
            return !text.StartsWith(" ");
        }

        public static bool HasNoTrailingSpace(string text)
        {
            return !text.EndsWith(" ");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var failures = new List<string>();
            if (!ValidationSeries.Check(" Hello World", failures))
            {
                foreach (var f in failures)
                {
                    Console.WriteLine(f);
                }
            }
        }