我正在努力探索LINQ,并得出结论,搜索几十个例子,直到我找到一个接近我自己在C#中的应用程序,并没有教我如何钓鱼.
所以回到我立即打砖墙的文档.
有人可以帮我解密一下在msdn http://msdn.microsoft.com/en-us/library/bb548891.aspx上提供的Enumerable.Select方法, 并作为Intellisense的提示给出?
Enumerable.Select(TSource,TResult)方法(IEnumerable(TSource>),Func(TSource,TResult))
如果有助于参考,这是与行号分解的同一行:
从您引用的MSDN文章中查看C#中此方法的定义可能会有所帮助:
public static IEnumerable<TResult> Select<TSource, TResult>(
this IEnumerable<TSource> source,
Func<TSource, TResult> selector
)
Run Code Online (Sandbox Code Playgroud)
在<
尖括号>
表示类型参数,这个泛型方法,我们可以简单地通过看什么类型的参数都在做开始探索方法的目的.
我们首先查看泛型方法的名称:
Select<TSource, TResult>
Run Code Online (Sandbox Code Playgroud)
这告诉我们调用的方法Select
处理两种不同的类型:
TSource
; 和TResult
我们来看看参数:
IEnumerable<TSource> source
- 一个提供TSource
枚举的源.Func<TSource, TResult> selector
- 一个选择器函数,它将a TSource
转换为a TResult
.(这可以通过探索定义来验证Func
)然后我们看看它的返回值:
IEnumerable<TResult>
Run Code Online (Sandbox Code Playgroud)
我们现在知道这个方法会返回一个TResult
枚举.
总而言之,我们有一个枚举的TSource
函数,以及一个接受单个TSource
项并返回TResult
项的选择器函数,然后整个select函数返回一个枚举TResult
.
一个例子:
为了具体而言,我们可以说TSource
是类型Person
(代表一个人的类,具有名称,年龄,性别等),并且TResult
是类型String
(代表人的名字).我们将给Select
函数一个Person
s 列表,以及一个函数,给定一个Person
将只选择它们的名称.作为调用此Select
函数的输出,我们将获得一个String
仅包含人名的s 列表.
在旁边:
原始方法签名的最后一块拼图位于顶部,是this
第一个参数之前的关键字.这是定义扩展方法的语法的一部分,它实质上意味着不是调用静态Select方法(传入源枚举和选择器函数),而是直接在枚举上调用Select方法,就像如果它有一个Select
方法(并且只传入一个参数 - 选择器函数).
我希望这能让你更清楚吗?
想到Select的方法是映射序列的每个元素.因此:
Enumerable.Select<TSource, TResult>
:Select方法由其源和结果类型(您要映射的事物的类型以及要将其映射到的类型)参数化
IEnumerable<TSource>
:要映射的事物序列
Func<TSource, TResult>
:映射函数,将应用于源序列的每个元素
结果是IEnumerable<TResult>
一系列映射结果.
例如,您可以想象(作为一个简单的示例)将整数序列映射到字符串表示:
IEnumerable<string> strings = ints.Select(i => i.ToString());
Run Code Online (Sandbox Code Playgroud)
这里整数是IEnumerable<TSource>
(IEnumerable<int>
)和i => i.ToString()
是Func<TSource, TResult>
(Func<int, string>
).
归档时间: |
|
查看次数: |
2634 次 |
最近记录: |