生成和组合集合中的函数

时间:2017-08-06 10:23:23

标签: c# functional-programming purely-functional

我想编写一系列函数,当给定一个字符串时,它会通过所有创建的函数并生成一个修改后的字符串。 e.g。

string[] arr = {"po", "ro", "mo", "do"};

var modify = "pomodoroX";
foreach (var token in arr)
{
    modify = modify.Replace(token, "");
}
Console.WriteLine(modify); // Output: X

这解决了这个问题,但我对功能解决方案感兴趣:

Console.WriteLine(
    arr.Select<string, Func<string, string>>(val => (s1 => s1.Replace(val, string.Empty)))
       .Aggregate((fn1, fn2) => fn1 += fn2)
       .Invoke("pomodoroX")
); 
   // Output: pomoroX -> Only last element applied because: 
   // the functions are not getting combined.

所以基本上,取数组“arr”并为每个字符串创建一个删除该字符串的函数。 当前的解决方案存在缺陷,仅应用最后一个函数,我似乎无法将其转换为委托,以便将它们与+=运算符组合。

还是有更好的功能解决方案吗?

2 个答案:

答案 0 :(得分:3)

好吧,你的Select为你提供了一个代表集合,它们接收一个字符串,并生成修改过的字符串,所以你就在那里。您所需要的只是通过Aggregate将它们链接在一起 - 您的方式如下:

string[] arr = { "po", "ro", "mo", "do" };

string result = arr
    // Produce our collection of delegates which take in the string,
    // apply the appropriate modification and return the result.
    .Select<string, Func<string, string>>(val => s1 => s1.Replace(val, string.Empty))
    // Chain the delegates together so that the first one is invoked
    // on the input, and each subsequent one - on the result of
    // the invocation of the previous delegate in the chain.
    // fn1 and fn2 are both Func<string, string>.
    .Aggregate((fn1, fn2) => s => fn2(fn1(s)))
    .Invoke("pomodoroX");

Console.WriteLine(result); // Prints "X".

答案 1 :(得分:1)

我真的不知道什么算作“功能性”。我假设您不想使用任何流量控制结构。

这更简单,你不觉得吗?

string[] arr = {"po", "ro", "mo", "do"};
arr.Aggregate("pomodoroX", (x, y) => x.Replace(y, ""))