Есть ли LINQ эквивалент следующего?Перерыв в функциональном составе при использовании LINQ
static T Compose<T>(T source,
IEnumerable<Func<T, T>> funcs,
Func<T, bool> cond)
{
foreach (var func in funcs)
{
source = func(source);
if (cond(source)) break;
}
return source;
}
// This ends the composition as soon as a null is returned
var result = Compose(x, funcs, x => x == null);
По сути, я хотел бы сочинить функции друг на друга, и сломаться, если текущее значение соответствует определенному условию.
result = f(g(h(x))) // if condition is met somewhere within this chain,
// it will immediately break and return
EDIT: Я думал о чем-то вдоль линий
funcs.Aggregate(seed, (x, f) => cond(x) ? x : f(x));
но выглядит запутанным, а также заканчивает перечисление по всей коллекции, а не нарушение, когда условие встретил.
Чтобы остановить вычисления после условия не будут выполнены вы можете агрегировать сами функции, а не результат их выполнения: 'funcs.Aggregate ((cur, next) => (i => {var val = cur (i); return cond (val)? next (val): val; })) ' – reptile