【问题标题】:C# notation understanding Select(int.Parse)C# 符号理解 Select(int.Parse)
【发布时间】:2017-06-08 11:37:36
【问题描述】:

我找到了一个我完全理解的小脚本。例如,我有一个带有“1 -2 5 40”的字符串。它读取输入字符串,将其拆分为一个临时数组。然后解析这个数组并将每个元素转换为一个整数。整件事是为了将最接近的整数设为零。

但我不明白的是符号 Select(int.Parse)。这里没有 lambda 表达式,并且方法 int.Parse 没有用方括号调用。与 OrderBy(Math.Abs​​)

相同

提前谢谢你=)

var temps = Console.ReadLine().Split(new []{' '}, StringSplitOptions.RemoveEmptyEntries);  

var result = temps.Select(int.Parse)
.OrderBy(Math.Abs)
.ThenByDescending(x => x)
.FirstOrDefault();

【问题讨论】:

    标签: c# linq lambda expression notation


    【解决方案1】:

    int.Parse 是一个方法组 - 您看到的是方法组转换为委托。要在没有 LINQ 的情况下查看它:

    Func<string, int> parser = int.Parse;
    int x = parser("10"); // x=10
    

    大致相当于:

    Func<string, int> parser = text => int.Parse(text);
    

    ...尽管如果您想深入了解细节,会有很多不同之处:)

    【讨论】:

      【解决方案2】:

      Select(int.Parse) 几乎等同于Select(x =&gt; int.Parse(x))

      Select 需要一个Func&lt;T, R&gt;,在这种情况下它也是int.Parse 的签名(它有一个带返回值的参数)。它将方法组转换为匹配的委托。

      在这种情况下,Func&lt;T, R&gt; 将映射到 Func&lt;string, int&gt;,因此它匹配 int Parse(string) 签名。

      【讨论】:

        【解决方案3】:

        int.Parse 是一个带有签名字符串 -> int 的方法(或者实际上是一个方法组,具有不同的签名。但是编译器可以推断你需要这个,因为它是唯一适合的。

        您可以将此方法用作参数,只要您提供具有相同签名的委托参数。

        【讨论】:

        • 这并不能解释为什么你可以这样使用它。
        【解决方案4】:

        .Select() 的参数是 Func&lt;T1, T2&gt;(),其中 T1 是输入参数(temps 的各个值),T2 是返回类型。

        通常,这写为 lambda 函数:x =&gt; return x + 1 等。但是,任何符合泛型定义的方法都可以使用,而不必写为 lambda,因为方法名称与分配 lambda 的名称相同到一个变量。

        所以Func&lt;string, int&gt; parseInt = s =&gt; Convert.ToInt32(s);在语法上等价于调用方法int.Parse(s)

        该语言创建了自动将 Func 参数传递给 inside 方法的快捷方式,以创建更具可读性的代码。

        【讨论】:

          【解决方案5】:

          选择 LINQ IEnumerable 扩展方法签名如下所示:

          public static IEnumerable<TResult> Select<TSource, TResult>(
              this IEnumerable<TSource> source,
              Func<TSource, TResult> selector
          )
          

          查看selector 参数。在您的情况下,您传递给 Select .Net 标准函数 int.Parse 具有签名:

          public static int Parse(
              string s
          )
          

          .Net 编译器可以将委托转换为 Func<...> 或 Action<...>。在 int.Parse 的情况下,它可以转换为 Func,因此可以作为参数传递给 Select 方法。

          与 OrderBy 完全相同。也看看它的签名。

          【讨论】:

            猜你喜欢
            • 2013-06-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-02-24
            • 2011-09-11
            • 2011-06-15
            • 2010-10-05
            相关资源
            最近更新 更多