Idea#2 for C#语法糖管式表示法

Idea#2 for C#语法糖管式表示法,c#,syntax,C#,Syntax,我认为这在某种程度上已经在F#中用|>操作符实现了,但我希望在C#中用现有方法实现它,而不需要全部重写它们。我经常看到这样的代码: var str = string.Join("|", Regex.Split(File.ReadAllText(@"C:\file.txt"), @"EOL(\r\n?|\n)", RegexOptions.IgnoreCase).Where(s => s != "")); str包含什么?您必须仔细查看括号,看到它首先读取文本文件,然后

我认为这在某种程度上已经在F#中用|>操作符实现了,但我希望在C#中用现有方法实现它,而不需要全部重写它们。我经常看到这样的代码:

var str = string.Join("|", Regex.Split(File.ReadAllText(@"C:\file.txt"),
          @"EOL(\r\n?|\n)", RegexOptions.IgnoreCase).Where(s => s != ""));
str包含什么?您必须仔细查看括号,看到它首先读取文本文件,然后正则表达式将其拆分,然后删除空行,然后将它们连接在一起。它们的书写顺序往往与执行顺序相反。更自然的写法是:

var str = File.ReadAllText(@"C:\file.txt")
          |> Regex.Split(@"EOL(\r\n?|\n)", RegexOptions.IgnoreCase)
          |> Where(s => s != "")
          |> string.Join("|")
|>运算符将上一个结果作为
this
(对于Where())或作为具有兼容类型的第一个参数(对于Regex.Split(),它是第一个参数;对于string.Join(),它是第二个参数)传递给下一个代码段。我们可以通过应用另一种语法糖进一步简化代码,如下所示:

在我看来,这似乎比第一段代码更容易阅读,而且顺序是操作完成的真实顺序,因此更符合逻辑。没有方法不需要重写,这将适用于所有当前代码,只添加了|>操作符。通过这种方式,我们以一种简单的线性方式使用来自各地的方法,不管它们与类型的关系如何(作为该类型的方法,或者作为参数接收该类型的方法),这反映了执行顺序

编辑:我的问题是:你认为这会有用吗

我将在这里进一步补充一点——因为我们不再像第一段代码中那样嵌套方法,我们可以完全选择括号,使代码更具可读性:

var str = File.ReadAllText @"C:\file.txt"
          |> Regex.Split @"EOL(\r\n?|\n)", .IgnoreCase
          |> Where . != ""
          |> string.Join "|"

您提供的示例完全混乱。

在某些情况下,可以像使用普通点运算符一样使用新运算符。在其他情况下,使用它替换运算符后面方法的第一个或最后一个参数。这不是语法上的甜点,因为没有固定的规则,你的新操作符的意思是什么。

如果你所关心的只是嵌套括号的纠结,那么构建一个
管道
扩展方法,让你平展调用是很简单的

(它没有你建议的语法糖分和参数自动插入推断。在我看来,参数自动插入无论如何都不是一个好主意,而且会使代码变得不易理解。)

var s=File.ReadAllText(@“c:\File.txt”)
.Pipe(x=>Regex.Split(@“EOL(\r\n?|\n)”,x,RegexOptions.IgnoreCase))
.其中(x=>x!=“”)
.Pipe(x=>string.Join(“|”,x));
// ...
公共静态TOut管道(此TIn源,Func Func)
{
如果(func==null)
抛出新的ArgumentNullException(“func”);
返回函数(源);
}

str包含什么?
是我在这里看到的唯一问题。你的问题是什么?如何用预处理器或替代C#编译器实现类似的东西?如果有什么问题,这属于on,而不是堆栈溢出。这读起来像一篇博客文章。这不是一件坏事,但它并不真正适合SO主题。规则非常明确:左运算符作为兼容类型的第一个参数传递:对于
Regex.Split()
,它是第一个参数,因为这是
string
类型的第一个参数,对于
string.Join()
第二个参数,因为它是
string[]类型的第一个参数。
@manixrock:在all@manixrock:此外:对于
中的
是正确的操作数的情况,您的运算符与点运算符一样使用。要应用您的规则,它必须是可枚举的。其中
var str = File.ReadAllText @"C:\file.txt"
          |> Regex.Split @"EOL(\r\n?|\n)", .IgnoreCase
          |> Where . != ""
          |> string.Join "|"
var s = File.ReadAllText(@"c:\file.txt")
            .Pipe(x => Regex.Split(@"EOL(\r\n?|\n)", x, RegexOptions.IgnoreCase))
            .Where(x => x != "")
            .Pipe(x => string.Join("|", x));

// ...

public static TOut Pipe<TIn, TOut>(this TIn source, Func<TIn, TOut> func)
{
    if (func == null)
        throw new ArgumentNullException("func");

    return func(source);
}