C# 函数式编程打印可被2整除的数字

C# 函数式编程打印可被2整除的数字,c#,functional-programming,C#,Functional Programming,我正在学习函数式编程,我正在编写一个函数,它可以输出可除2的数字。我知道在函数式编程中,它应该避免循环,并且应该具有引用透明性,所以变量应该是不可变的。这就是我写的函数,这是否符合函数编程范式 public static void evenNumbers(int start, int end) { if (start <= 20) { if (start % 2 == 0) { System.Console.Writ

我正在学习函数式编程,我正在编写一个函数,它可以输出可除2的数字。我知道在函数式编程中,它应该避免循环,并且应该具有引用透明性,所以变量应该是不可变的。这就是我写的函数,这是否符合函数编程范式

public static void evenNumbers(int start, int end)
{

    if (start <= 20)
    {
        if (start % 2 == 0)
        {
            System.Console.WriteLine(start);
        }
        evenNumbers(start + 1, end);
    }
} 
public静态空数(int开始,int结束)
{
if(start如果您想用c#编写“函数”代码,请使用LINQ扩展方法

var valuesToPrint = 
    Enumerable.Range(start, end - start)
              .Where(value => number % 2 == 0)
              .Select(value => value.ToString());
var output = String.Join(Environment.NewLine, valuesToPrint)

// Console is external resource (aka global state)
Console.WriteLine(output);
如果您非常喜欢LINQ,可以使用
.Aggregate
扩展方法构建输出

var output = 
    Enumerable.Range(start, end - start)
              .Where(value => number % 2 == 0)
              .Aggregate(new StringBuilder(),
                         (builder, value) => builder.AppendLine(value),
                         builder => builder.ToString());

Console.Write(output);

有些人会争论
Aggregate
StringBuilder
不是纯粹的函数,因为我们更新了
StringBuilder

的同一个实例的内部状态,如果你试图学习函数式编程,那么为什么不使用函数式语言,比如F#?如何定义
question1
函数式编程ach将返回一系列匹配的数字,而不是执行作为进程一部分的副作用(如
Console.WriteLine
)。我认为在内部调用Console.WriteLine已经破坏了此函数的功能性质。要适合FP,您的函数应该返回列表,而不是打印它。如果我更改System.Console.WriteLink(启动)返回启动是否有效?如果列表不是很大,我们可以考虑替换字符串。加入<代码>。聚合((a,x)=a+,“+x”< /代码> @ Matt。G,我建议使用<代码>聚合< /代码> <代码> StringBuilder < /C> >,然后此方法也适用于更大的集合。
var output = 
    Enumerable.Range(start, end - start)
              .Where(value => number % 2 == 0)
              .Aggregate(new StringBuilder(),
                         (builder, value) => builder.AppendLine(value),
                         builder => builder.ToString());

Console.Write(output);