【问题标题】:Where to practice Lambda function? [closed]在哪里练习 Lambda 函数? [关闭]
【发布时间】:2010-09-19 15:29:14
【问题描述】:

我目前正在尝试学习 C#3.0 的所有新功能。我找到了一个很好的 sample to practice LINQ 集合,但我找不到 Lambda 的类似内容。

你有我可以练习 Lambda 函数的地方吗?

更新

LINQpad 非常适合学习 Linq(感谢建议的人)并在某些表达式中使用一点 Lambda。但是对于 Lambda 的更具体的练习,我会很感兴趣。

【问题讨论】:

    标签: c# .net-3.5 lambda c#-3.0


    【解决方案1】:

    目前我发现的最好的是link。这是一个可以练习的测验,但我想要更多的 Lambda 和更少的 LINQ。

    【讨论】:

      【解决方案2】:

      Lambdas 就是这样一种东西,一旦你开始思考,你就会“明白”它。如果您当前正在使用委托,则可以将其替换为 lambda。此外,System.Action<...>System.Func<...>System.Predicate<...> 的添加也是不错的快捷方式。不过,一些显示语法的示例会有所帮助(警告:它们是空洞的,但我想说明如何交换函数):

      public static void Main()
      {
          // ToString is shown below for clarification
          Func<int,string,string> intAndString = (x, y) => x.ToString() + y.ToString();
          Func<bool, float, string> boolAndFloat = (x, y) => x.ToString() + y.ToString();
      
          // with declared
          Combine(13, "dog", intAndString);
          Combine(true, 37.893f, boolAndFloat);
      
          // inline
          Combine("a string", " with another", (s1, s2) => s1 + s2);
          // and multiline - note inclusion of return
          Combine(new[] { 1, 2, 3 }, new[] { 6, 7, 8 },
              (arr1, arr2) =>
              {
                  var ret = "";
                  foreach (var i in arr1)
                  {
                      ret += i.ToString();
                  }
                  foreach (var n in arr2)
                  {
                      ret += n.ToString();
                  }
      
                  return ret;
              }
          );
      
          // addition
          PerformOperation(2, 2, (x, y) => 2 + 2);
          // sum, multi-line
          PerformOperation(new[] { 1, 2, 3 }, new[] { 12, 13, 14 },
              (arr1, arr2) =>
              {
                  var ret = 0;
                  foreach (var i in arr1)
                      ret += i;
                  foreach (var i in arr2)
                      ret += i;
                  return ret;
              }
          );
      
          Console.ReadLine();
      
      }
      
      public static void Combine<TOne, TTwo>(TOne one, TTwo two, Func<TOne, TTwo, string> vd)
      {
          Console.WriteLine("Appended: " + vd(one, two));
      }
      
      public static void PerformOperation<T,TResult>(T one, T two, Func<T, T, TResult> func)
      {
          Console.WriteLine("{0} operation {1} is {2}.", one, two, func(one,two));
      }
      

      最让我感到困惑的是快捷语法,例如,当使用 System.Action 只执行不带参数的委托时:

      var a = new Action(() => Console.WriteLine("Yay!"));
      

      或者你可以这样做:

      Action a = () => Console.WriteLine("Yay");
      

      当您有一个带有一个参数的ActionFuncPredicate 时,您可以省略括号:

      var f = new Func<int, bool>(anInt => anInt > 0);
      

      或:

      // note: no var here, explicit declaration
      Func<int,bool> f = anInt => anInt > 0;
      

      代替:

      Func<int,bool> f = (anInt) => anInt > 0;
      

      或者走极端:

      Func<int,bool> f = (anInt) =>
      {
          return anInt > 0;
      }
      

      如上所示,单行 lambdas 不需要 return 语句,但多行 Func lambdas 需要。

      我认为您会发现学习如何使用 lambda 的最佳方法是大量使用集合并将 System.Linq 包含在您的 using 命名空间中 - 您会看到大量的集合扩展方法以及其中大多数方法让你锻炼你对 lambdas 的了解。

      【讨论】:

        【解决方案3】:

        LINQPad是学习LINQ的好工具

        【讨论】:

        • 令人印象深刻的软件,加上一些 Intelicense 就完美了。
        • 但问题更多的是 Lambda 而不是 LINQ。
        猜你喜欢
        • 2011-06-22
        • 2011-03-06
        • 1970-01-01
        • 1970-01-01
        • 2011-02-22
        • 1970-01-01
        • 1970-01-01
        • 2011-11-23
        • 2011-03-23
        相关资源
        最近更新 更多