c# - “在哪里”和“选择”如何在 LINQ 中工作?
问题描述
我有以下代码片段。我对后面提到的代码片段几乎没有疑问。
var salaries = customerList
.Where(c => c.Age > 30)
.Select(c => c.Salary) // salary is of type long
.ToList();
- 在上面的代码片段中,“Where”如何访问 customerList 以及它如何定义“c”的类型?
- 在应用 Select 所作用的过滤器后,“Where”是否会返回客户的临时列表?
- “Select”究竟如何知道它必须只返回“Salary”?
- 变量“salaries”的类型如何设置为 List<long>?
解决方案
Where
可能是这样实现的(请注意,这是一个非常粗略的实现,只是让您了解它的样子):
public static IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> predicate) {
foreach (T t in source) {
if (predicate(t)) {
yield return t;
}
}
}
请注意,这Where
是一种扩展方法。你本质上是在打电话Where(customerList, c => c.Age > 30)
。现在您应该看到它在哪里可以访问customerList
. 它还T
通过查看是什么来推断应该是什么IEnumerable
customerList
。因为它是 a IEnumerable<Customer>
,T
is Customer
,所以它期望 aFunc<Customer, bool>
作为第二个参数。它就是这样知道c
的Customer
。
Where
不返回临时列表。许多 LINQ 方法都使用延迟评估。Where
返回一个IEnumerable<Customer>
被过滤的。请记住,这IEnumerable
只是一系列事情。Where
但是,在您要求之前,不会评估由返回的这个序列。Select
做同样的事情。因此,在您调用之前不会创建列表ToList
。
您的第三个问题有点像问“如何Where
知道如何过滤”或“如何Console.WriteLine
知道如何写入屏幕”。就是Select
这样。如果需要,您可以查看它的实现。这是一个粗略的草图:
public static IEnumerable<U> Select<T, U>(this IEnumerable<T> source, Func<T, U> mapping) {
foreach (T t in source) {
yield mapping(t);
}
}
salaries
通过查看您调用的每个方法的方法签名来确定变量的类型。您的Select
调用返回 a IEnumerable<long>
,并且ToList
的签名告诉编译器,给定 aIEnumerable<T>
它将返回List<T>
,所以在这种情况下,它返回 a List<long>
。
推荐阅读
- jpa - 升级到 Payara 5/ElipseLink 2.7.0 后,已建立的 JPQL 查询不再起作用
- redux - Redux 在更改时调用函数
- authorization - 在哪里对 PDP 中的 Attribute-Providers 仔细检查 XACML 请求的属性?
- java - Twilio 呼叫用户,播放音频并接收回调
- python-2.7 - 如何使用模块“printer_zpl2”打印标签
- r - 在闪亮的应用程序中使用 devtools 导入的包
- python - 如何从给定的 n-dim 索引中获取值
- function - Filemaker - 如何/在哪里使用自定义功能?
- ruby-on-rails - RubyOnRails 从数据库中提取信息
- spring - Tomcat-embed-jasper 添加但 jsp 页面 Whitelabel 404 错误