8

我目前正在尝试学习 C#3.0 的所有新功能。我找到了一个非常好的示例来练习 LINQ,但我找不到 Lambda 的类似内容。

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

更新

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

4

3 回答 3

6

LINQPad是学习LINQ的好工具

于 2008-10-28T18:16:36.600 回答
4

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");

当你有一个Action, Func, orPredicate有一个参数时,你可以省略括号:

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;
}

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

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

于 2008-10-28T19:01:38.273 回答
1

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

于 2008-10-28T19:26:34.197 回答