支持 LINQ 的 C# 3.0 功能
更新:2007 年 11 月
下面一节介绍 C# 3.0 中的新语言构造。虽然这些新功能在一定程度上都用于 LINQ 查询,但并限于 LINQ,如果认为有用,在任何情况下都可以使用这些新功能。
查询表达式
查询表达式使用类似于 SQL 或 XQuery 的声明性语法来查询 IEnumerable 集合。在编译时,查询语法转换为对 LINQ 提供程序的标准查询运算符扩展方法实现的方法调用。应用程序通过使用 using 指令指定适当的命名空间来控制范围内的标准查询运算符。下面的查询表达式获取一个字符串数组,按字符串中的第一个字符对字符串进行分组,然后对各组进行排序。
var query = from str in stringArray
group str by str[0] into stringGroup
orderby stringGroup.Key
select stringGroup;
有关更多信息,请参见 LINQ 查询表达式(C# 编程指南)。
隐式类型化变量 (var)
不必在声明并初始化变量时显式指定类型,您可以使用 var 修饰符来指示编译器推断并分配类型,如下所示:
var number = 5;
var name = "Virginia";
var query = from str in stringArray
where str[0] == 'm'
select str;
声明为 var 的变量与显式指定其类型的变量一样都是强类型。通过使用 var,可以创建匿名类型,但它可用于任何局部变量。也可以使用隐式类型声明数组。
有关更多信息,请参见隐式类型的局部变量(C# 编程指南)。
对象和集合初始值设定项
通过对象和集合初始值设定项,初始化对象时无需为对象显式调用构造函数。初始值设定项通常用在将源数据投影到新数据类型的查询表达式中。假定一个类名为 Customer,具有公共 Name 和 Phone 属性,可以按下列代码中所示使用对象初始值设定项:
Customer cust = new Customer {Name = "Mike" ; Phone ={ "555-1212 "};
有关更多信息,请参见对象和集合初始值设定项(C# 编程指南)。
匿名类型
匿名类型由编译器构建,且类型名称只可用于编译器。匿名类型提供了一种在查询结果中临时分组一组属性的方便方法,无需定义单独的命名类型。使用新的表达式和对象初始值设定项初始化匿名类型,如下所示:
select new {name = cust.Name, phone = cust.Phone};
有关更多信息,请参见匿名类型(C# 编程指南)。
扩展方法
扩展方法是一种可与类型关联的静态方法,因此可以像实例方法那样对类型调用它。实际上,此功能使您能够将新方法“添加”到现有类型,而不会实际修改它们。标准查询运算符是一组扩展方法,它们为实现 IEnumerable<T> 的任何类型提供 LINQ 查询功能。
有关更多信息,请参见扩展方法(C# 编程指南)。
Lambda 表达式
Lambda 表达式是一种内联函数,该函数使用 => 运算符将输入参数与函数体分离,并且可以在编译时转换为委托或表达式树。在 LINQ 编程中,在您对标准查询运算符进行直接方法调用时,会遇到 lambda 表达式。
有关更多信息,请参见:
自动实现的属性
通过自动实现的属性,可以更简明地声明属性。当您如下面的示例中所示声明属性时,编译器将创建一个私有的匿名支持字段,该字段只能通过属性 getter 和 setter 进行访问。
public string Name {get; set;}
有关更多信息,请参见自动实现的属性(C# 编程指南)。