Jon*_*eet 81
询问LINQ的特定方面更有意义.这有点像问"Windows如何工作"否则.
从C#的角度来看,LINQ的关键部分对我来说是:
Lambda表达式.这些是这样的表达式:
x => x * 2
(int x, int y) => x * y
() => { Console.WriteLine("Block"); Console.WriteLine("Lambda"); }
Run Code Online (Sandbox Code Playgroud)
Lambda表达式转换为委托或表达式树.
匿名类型.这些是这样的表达式:
new { X=10, Y=20 }
Run Code Online (Sandbox Code Playgroud)
这些仍然是静态类型的,只是编译器为您生成具有属性X和的不可变类型Y.通常使用var它们,允许从其初始化表达式推断出局部变量的类型.
查询表达式.这些是这样的表达式:
from person in people
where person.Age < 18
select person.Name
Run Code Online (Sandbox Code Playgroud)
这些由C#编译器转换为"普通"C#3.0(即不使用查询表达式的表单).之后应用重载分辨率等,这对于能够使用具有多种数据类型的相同查询语法是绝对关键的,而编译器不具有诸如Queryable之类的任何类型的知识.上述表达将被翻译成:
people.Where(person => person.Age < 18)
.Select(person => person.Name)
Run Code Online (Sandbox Code Playgroud)扩展方法.这些是静态方法,可以像使用第一个参数类型的实例方法一样使用.例如,像这样的扩展方法:
public static int CountAsciiDigits(this string text)
{
return text.Count(letter => letter >= '0' && letter <= '9');
}
Run Code Online (Sandbox Code Playgroud)
然后可以像这样使用:
string foo = "123abc456";
int count = foo.CountAsciiDigits();
Run Code Online (Sandbox Code Playgroud)
注意,执行CountAsciiDigits使用另一种扩展方法,Enumerable.Count().
这是大多数相关的语言方面.然后是LINQ提供程序中的标准查询运算符的实现,例如LINQ to Objects和LINQ to SQL等.我有一个关于如何实现LINQ to Objects相当简单的演示文稿 - 它位于C#的"Talks"页面上在深度网站.
LINQ to SQL等提供程序的工作方式通常是通过Queryable类.他们的核心是将表达式树转换为其他查询格式,然后使用执行这些进程外查询的结果构造适当的对象.
这涵盖了您感兴趣的一切吗?如果有什么特别的东西你仍然想知道,只需编辑你的问题,我就会去.
LINQ基本上是这些C#3.0离散功能的组合:
有关到达目的地(LINQ)的更多信息,请参阅LANGNET 2008中Anders的视频:
| 归档时间: |
|
| 查看次数: |
28799 次 |
| 最近记录: |