难以理解特定的lambda表达式

use*_*103 3 c# linq lambda

对于一个熟悉lambda的人来说,这是一个非常简单的问题.我刚刚学习它,并遇到了一个对我没有意义的表达.

根据我的理解,lambda表达式传入左侧指定的变量并运行右侧的代码.例如

myFunction = x => x + x;
Run Code Online (Sandbox Code Playgroud)

所以myFunction(2)会返回4.

无论如何,我在这里看了一个linq查询,看到了这个:

IEnumerable<int> numQuery2 = numbers.Where(num => num % 2 == 0).OrderBy(n => n);
Run Code Online (Sandbox Code Playgroud)

n => n... ...这是什么呢?为什么不说呢OrderBy(n)?所有你正在做的事情是将n传递给一个只返回的函数n.> _>这里发生了什么?

Jon*_*eet 9

n => n... ...这是什么呢?

它只是将任何值映射到自身.这是一个身份功能.

为什么不说OrderBy(n)?

因为n范围不是变量 - 所以这样调用它是无效的.这不是lambda表达式,因此它只会尝试n用作普通的方法参数.

你的代码只是想说,而不是每个元素投射到一些其他的价值"被整个的每个元素的订购此序列",但没有直接说的方式.

OrderBy 需要从元素类型到排序键类型的投影 - 只是在这种情况下我们需要身份投影.

您可以编写自己的额外扩展方法:

public static IEnumerable<T> OrderNaturally<T>(this IEnumerable<T> source)
{
    return source.OrderBy(item => item);
}
Run Code Online (Sandbox Code Playgroud)

然后将原始声明更改为:

IEnumerable<int> numQuery2 = numbers.Where(num => num % 2 == 0).OrderNaturally();
Run Code Online (Sandbox Code Playgroud)

如果你发现更可读.

或者,您可以创建一个Functions包含一些有用的静态只读字段的类:

public static class Functions<T>
{
    public static readonly Func<T, T> Identity = x => x;
    public static readonly Func<T, T> DefaultValue => x => default(T);
    public static readonly Func<T, string> ToString = x => x == null ? null : x.ToString();
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后:

IEnumerable<int> numQuery2 = numbers.Where(num => num % 2 == 0)
                                    .OrderBy(Functions<int>.Identity)
Run Code Online (Sandbox Code Playgroud)

我不认为我做到这一点...我只是暗示事情要考虑:)