我很难理解LINQ,并得出结论,搜索几十个例子,直到找到一个接近我自己在C#中的应用程序的例子,并没有教我如何钓鱼。
回到我立刻碰到砖墙的文档。
有人可以帮我解密一下msdn上提供的Enumerable.Select方法 http://msdn.microsoft.com/en-us/library/bb548891.aspx并作为Intellisense的小费提供?
Enumerable.Select(TSource,TResult)方法(IEnumerable(TSource>),Func(TSource,TResult))
如果有助于引用,则这一行与行号分解:
答案 0 :(得分:7)
从您引用的MSDN文章中查看C#中此方法的定义可能会有所帮助:
public static IEnumerable<TResult> Select<TSource, TResult>(
this IEnumerable<TSource> source,
Func<TSource, TResult> selector
)
<
尖括号>
表示此泛型方法的类型参数,我们可以通过查看类型参数的作用来开始探索方法的目的。
我们首先查看通用方法的名称:
Select<TSource, TResult>
这告诉我们,名为Select
的方法处理两种不同的类型:
TSource
;和TResult
让我们看一下参数:
IEnumerable<TSource> source
- 来源,提供TSource
枚举。Func<TSource, TResult> selector
- 一个选择器函数,它接受TSource
并将其转换为TResult
。 (这可以通过探索Func
)然后我们看一下它的返回值:
IEnumerable<TResult>
我们现在知道此方法将返回TResult
枚举。
总结,我们有一个枚举TSource
的函数,以及一个选择器函数,它接受单个TSource
项并返回TResult
项,然后整个select函数返回TResult
的枚举。
示例:
为了具体说明这一点,我们可以说TSource
类型为Person
(代表一个人的类,名称,年龄,性别等),TResult
属于String
类型(代表该人的姓名)。我们将为Select
函数提供Person
的列表,以及一个函数,给定Person
将仅选择其名称。作为调用此Select
函数的输出,我们将获得仅包含人名的String
列表。
<强>除了:强>
原始方法签名的最后一个拼图位于顶部,是第一个参数之前的this
关键字。这是定义Extension Methods的语法的一部分,它实质上意味着不是调用静态Select方法(传入源枚举和选择器函数),而是直接在枚举上调用Select方法,就好像它有一个Select
方法(并只输入一个参数 - 选择器函数)。
我希望这能让你更清楚吗?
答案 1 :(得分:5)
思考Select的方法是映射序列的每个元素。因此:
Enumerable.Select<TSource, TResult>
:Select方法由其源和结果类型(您要映射的事物的类型以及将其映射到的类型)参数化。
IEnumerable<TSource>
:要映射的事物序列
Func<TSource, TResult>
:映射函数,将应用于源序列的每个元素
结果是IEnumerable<TResult>
,一系列映射结果。
例如,你可以想象(作为一个简单的例子)将整数序列映射到字符串表示:
IEnumerable<string> strings = ints.Select(i => i.ToString());
此处为IEnumerable<TSource>
(IEnumerable<int>
),i => i.ToString()
为Func<TSource, TResult>
(Func<int, string>
)。
答案 2 :(得分:0)
我认为C# in Depth后面的章节很好地解释了LINQ,以及它的意义。此外,本书的其余部分还教授了其他一些非常有用的C#知识。