Feedback

C# - Functions verketten

Veröffentlicht von am 11/3/2015
(0 Bewertungen)
Da ich sehr oft Listen auf Grund eines oder mehreren Kriterien ausfiltere, habe ich mir da eine Erleichterungen für das Verketten von Functions geschrieben.
namespace System
{
    public static class FuncExtensions
    {
        public enum GroupType
        {
            And,
            Or
        }

        public static Func<T, bool> AndAlso<T>(this Func<T, bool> func1, Func<T, bool> func2)
        {
            if (func1 == null)
                throw new ArgumentNullException(nameof(func1));

            if (func2 == null)
                throw new ArgumentNullException(nameof(func2));

            return a => func1(a) && func2(a);
        }

        public static Func<T, bool> OrElse<T>(this Func<T, bool> func1, Func<T, bool> func2)
        {
            if (func1 == null)
                throw new ArgumentNullException(nameof(func1));

            if (func2 == null)
                throw new ArgumentNullException(nameof(func2));

            return a => func1(a) || func2(a);
        }

        public static Func<T, bool> Grouped<T>(IList<Func<T, bool>> functions, GroupType groupType = GroupType.Or)
        {
            if (functions == null)
                throw new ArgumentNullException(nameof(functions));

            Func<T, bool> result = a => groupType == GroupType.And;

            if (groupType == GroupType.And)
            {
                foreach (var func in functions)
                {
                    result = result.AndAlso(func);
                }
            }

            if (groupType == GroupType.Or)
            {
                foreach (var func in functions)
                {
                    result = result.OrElse(func);
                }
            }

            return result;
        }
    }
}
Abgelegt unter Function, Criteria.

1 Kommentare zum Snippet

Koopakiller schrieb am 11/3/2015:
Ich denke ein Verwendungsbeispiel würde helfen zu verstehen warum deine Methoden einen Vorteil bieten.
 

Logge dich ein, um hier zu kommentieren!