LINQ 和泛型类型

摘要:
字符串列表表示为list<它还提供了比将元素存储为对象集合更多的好处。泛型集合易于使用的原因是您不必执行运行时类型转换;就像非泛型集合类(如ArrayList)支持IEnumerable一样,变量LINQ将变量类型查询为IEnumeraable(OfT)或派生类型。查询将生成一个包含零个或多个Customer对象的序列;

LINQ 查询基于泛型类型,在 .NET Framework 的 2.0 版中引入了泛型类型。您无需深入了解泛型即可开始编写查询。但是,您可能需要了解两个基本概念:

  1. 当您创建泛型集合类(如 List(Of T))的实例时,您将“T”替换为列表将包含的对象的类型。例如,字符串列表表示为 List<string>,Customer 对象列表表示为List<Customer>。泛型列表是强类型的,且提供了比将其元素存储为 Object 的集合更多的好处。如果您尝试将 Customer 添加到 List<string>,则会在编译时出现一条错误。泛型集合易于使用的原因是您不必执行运行时类型强制转换。

  2. IEnumerable(Of T) 是一个接口,通过该接口,可以使用 foreach 语句来枚举泛型集合类。泛型集合类支持 IEnumerable(Of T),就像非泛型集合类(如ArrayList)支持 IEnumerable

有关泛型的更多信息,请参见泛型(C# 编程指南)

LINQ 查询中的 IEnumerable<T> 变量


LINQ 查询变量类型化为 IEnumerable(Of T) 或派生类型,如 IQueryable(Of T)。当您看到类型化为 IEnumerable<Customer> 的查询变量时,这只意味着在执行该查询时,该查询将生成包含零个或多个 Customer 对象的序列。

IEnumerable<Customer> customerQuery =
    from cust in customers
    where cust.City == "London"
    select cust;

foreach (Customer customer in customerQuery)
{
    Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}
有关更多信息,请参见查询操作中的类型关系 (LINQ)
 

让编译器处理泛型类型声明


如果您愿意,可以使用 var 关键字来避免使用泛型语法。var 关键字指示编译器通过查看在 from 子句中指定的数据源来推断查询变量的类型。下面的示例生成与上一个示例相同的编译代码:

var customerQuery2 = 
    from cust in customers
    where cust.City == "London"
    select cust;

foreach(var customer in customerQuery2)
{
    Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}

当变量的类型明显或显式指定嵌套泛型类型(如由组查询生成的那些类型)并不重要时,var 关键字很有用。通常,我们建议如果您使用 var,应意识到这可能使您的代码更难以让别人理解。有关更多信息,请参见隐式类型的局部变量(C# 编程指南)

 
 

免责声明:文章转载自《LINQ 和泛型类型》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇WPF实现渐变淡入淡出的动画效果C#中Internal关键字的总结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C# 编码规范、命名规则

1  规范目的 ……………………………………………………… 3 2  适用范围 ……………………………………………………… 3 3  代码注释 ……………………………………………………… 3   3.1    代码注释约定............................................ 3   3.2    模块头部注释规范.......

批处理bat脚本自动配置java的jdk环境变量

前言 每当更换电脑或者是重装系统之后,都需要重新配置java系统路径。但是又不想每次都去查配置方法,所以写了个脚本自动配置。 脚本内容 @echo off @echo 第一步 输入要设置的JAVA_HOME路径:(As example: D:\Program Files\Java\jdk1.8.0_181) set /p input="请输入JAVA_H...

几款主流 NoSql 数据库的对比

最近小组准备启动一个 node 开源项目,从前端亲和力、大数据下的IO性能、可扩展性几点入手挑选了 NoSql 数据库,但具体使用哪一款产品还需要做一次选型。 我们最终把选项范围缩窄在 HBase、Redis、MongoDB、Couchbase、LevelDB 五款较主流的数据库产品中,本文将主要对它们进行分析对比。 鉴于缺乏项目中的实战经验沉淀,本文内容...

Ansible之路——第九章:Ansible Playbook

Playbooks 是Ansible 管理配置、部署应用和编排的语言,可以使用Playbooks 来描述你想在远程主机执行的策略或者执行的一组步骤过程等。 如果说Ansible 模块是工作中的工具的话,那么playbooks 就是方案。 Playbooks 采用YAML 语法结构。 9.1 Playbooks 组成 Target section:定义将...

MPU6050滤波、姿态融合(一阶互补、卡尔曼)

前几天做了6050原始数据的串口输出和上位机波形的查看。这篇博客我们来看一下对原始数据的处理。 任务:利用STC89C52RC对MPU6050原始数据进行滤波与姿态融合。 首先我摘抄了一段别人在昨晚这个实验的写的最后总结。1.尽量不要用MPU6050内置的LPF滤波。虽然相比于原始加速度计输出,该LPF可以平滑输出,但是在FFT频谱上的表现相当差劲。2.广...

VBS数组函数学习实例分析

Array 函数 返回包含数组的Variant。 Array(arglist) 参数:arglist是赋给包含在Variant中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则将会创建零长度的数组。 说明:用于引用数组元素的表示符,由跟随有括号的变量名组成,括号中包含指示所需元素的索引号。 在下面的示例中,第一条语句创建名为 A 的...