Feedback

C# - Functions verketten

Veröffentlicht von am 03.11.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 03.11.2015:
Ich denke ein Verwendungsbeispiel würde helfen zu verstehen warum deine Methoden einen Vorteil bieten.
 

Logge dich ein, um hier zu kommentieren!