对于一个熟悉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
.> _>这里发生了什么?
该
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)
我不认为我会做到这一点...我只是暗示事情要考虑:)
归档时间: |
|
查看次数: |
242 次 |
最近记录: |