将Func <T,String>转换为Func <T,bool>

Pet*_*ter 13 c# func

我想我的想法正在爆发,试图找出Funcs ......如果这没有意义,我道歉,现在它对我有意义,但它已经是漫长的一天......

1)假设你有一个func,它接受T并输出一个字符串:

 Func<T, string> 
Run Code Online (Sandbox Code Playgroud)

你能把它变成一个接受T的函数并根据某些逻辑返回一个bool(在这种情况下,如果返回的字符串为空(String.IsNullOrWhiteSpace)?

 Func<T, bool> 
Run Code Online (Sandbox Code Playgroud)

如果给你一个,你可以做同样的事吗?

Expression<Func<T, string>>
Run Code Online (Sandbox Code Playgroud)

并需要将其转换为

Func<T, bool>
Run Code Online (Sandbox Code Playgroud)

返回true/false基于返回的字符串是否为空(String.IsNullOrWhiteSpace)?

谢谢

Car*_*ten 11

对于第一部分,您甚至可以制作一些"更高"的顺序函数:



Func<A,C> MapFun<A,B,C>(Func<A,B> input, Func<B,C> transf)
{
   return a => transf(input(a));
}

Run Code Online (Sandbox Code Playgroud)

使用



Func <T,string> test = ...
var result = MapFun(test, String.IsNullOrWhiteSpace);

Run Code Online (Sandbox Code Playgroud)

(我希望C#类型推断在这里工作)

如果您在Func上将其定义为扩展,则更容易:


public static class FuncExtension
{
    public static Func<A,C> ComposeWith<A,B,C>(this Func<A,B> input, Func<B,C> f)
    {
         return a => f(input(a));
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个非常简单的测试:


Func<int, string> test = i => i.ToString();
var result = test.ComposeWith(string.IsNullOrEmpty);
Run Code Online (Sandbox Code Playgroud)

对于第二个:我认为你可以将表达式编译成"真正的"Func,然后使用上面的代码.请参阅Expression.Compile上的MSDN文档

PS:重命名函数以更好地匹配它的意图(它的功能组成)