问题引出

  这视乎是个完全不必要进行讨论的话题,因为linq(这里具体是linq to objects)本来就是针对集合类型的,数组类型作为集合类型的一种当然可以使用了。不过我还是想写一下,这个问题源于qq群里一位朋友的提问:.net的数组类型都隐式继承了Array类,该类是一个抽象类,并且实现了IEnumerable、ICollection、IList接口。但linq的方法都是针对实现了IEnumerable<T>泛型接口的,Array类并没有实现这些泛型接口,为什么可以使用这些方法呢?

  linq to objects的本质是通过扩展方法来实现集合的查询,这些扩展方法定义在一个Enumerable的静态类中。Enumerable类下的所有扩展方法的第一个参数都是IEnumerable<T> 类型,表示它可以通过IEnumerable<T>类型进行调用。

浅析数组类型

1. 所有数组类型都隐式派生自Array

  当我们定义一个FileStream[] 数组时,CLR会为当前的AppDomain创建一个FileStream[] 类型,该类型派生自 Array。所以数组是引用类型,在堆中分配内存空间。Array类是一个抽象类,定义了许多关于常用的实例方法和静态方法,供所有的数组类型使用。例如常见的:Length属性,CopyTo方法等等。

2. 所有的数组类型都隐式实现了IEnumerable<T>接口

  就如上面所所的,这是一个理所当然的问题,为了提高开发效率,数组类型理应可以使用linq进行查询。但由于数组可以是多维数组或者非0基数组,所以Array类并没有实现IEnumerable<T>、ICollection<T>、IList<T> 这几个泛型接口,而只是实现了非泛型版本的。实际上,CLR会自动为一维的数组类型实现这些泛型接口(指定T类型参数的具体类型),并且还会为它们的父类实现。例如我们定义一个FileStream[] 数组类型,那么CLR会为我们创建如下的层次类型结构:

                              

由于CLR的隐式实现,才使我们可以将一维数组类型应用在需要IEnumerable<T>泛型接口的地方。

  按照上面的说法,我们可以将FileStream[] 类型的对象传递给如下的方法:

  void F1(IEnumerable<object> oEnumerable);

  void F2(ICollection<Stream> sCollection);

  void F3(IList<FileStream> fList);

  这是对于引用类型而言的,如果是值类型,则不为会它的基类实现这些接口。例如DateTimel类型(基类包括ValueType和Object),DateTime[]数组类型不能传递给上面的F1方法,这是因为值类型的数组的内存布局与引用类型的数组不同。

以上图片由“图斗罗”提供

转载于:https://www.cnblogs.com/ldyblogs/p/linq.html

数组为什么可以使用linq查询相关推荐

  1. C#语法之Linq查询基础一

    Linq做.Net开发的应该都用过,有些地方很复杂的逻辑用Linq很方便的解决.对于Linq to object.Linq to xml.Linq to sql.Linq to Entity(EF)都 ...

  2. [深入学习C#]LINQ查询表达式详解(1)——基本语法、使用扩展方法和Lambda表达式简化LINQ查询

    此文章非原创,转载自诗人江湖老,原文地址 在Git上下载源码 在工程中我们少不了要定义类或者结构去储存数据,这些数据将被临时地储存在内存中,现在我们想要对其完成一些类似于查找.过滤等等常见的任务的时候 ...

  3. LINQ 查询简介(MSDN)

    查询是一种从数据源检索数据的表达式.查询通常用专门的查询语言来表示.随着时间的推移,人们已经为各种数据源开发了不同的语言:例如,用于关系数据库的 SQL 和用于 XML 的 XQuery.因此,开发人 ...

  4. LINQ查询表达式基础

    LINQ,语言集成查询(Language Integrated Query)是一组用C#和Visual Basic语言的扩展. 对于编写查询的开发人员来说,LINQ 最明显的"语言集成&qu ...

  5. asp.net linq查询环境搭建

    本文是以sqlserver2008为数据库,vs2013为开发工具来介绍的. 要搭建这样一个数据库的操作环境,首先建立一个类库项目 然后在这个类库项目中添加几个类:DBDataContext数据库上下 ...

  6. LINQ 查询表达式(C# 编程指南)

    LINQ 查询表达式(C# 编程指南) 语言集成查询 (LINQ) 是一组技术的名称,这些技术建立在将查询功能直接集成到 C# 语言(以及 Visual Basic 和可能的任何其他 .NET 语言) ...

  7. linq 查询的结果会开辟新的内存吗?

    一:背景 1. 讲故事 昨天群里有位朋友问:linq 查询的结果会开辟新的内存吗?如果开了,那是对原序列集里面元素的深拷贝还是仅仅拷贝其引用? 其实这个问题我觉得问的挺好,很多初学 C# 的朋友或多或 ...

  8. [译]如何在C#中调试LINQ查询

    LINQ是我在C#中最喜欢的功能之一.它让代码看起来更漂亮美观.我们得到了一个易于编写和理解的简洁函数式语法.好吧,至少我们可以使用LINQ方法的语法风格. LINQ很难进行调试.我们无法知道该查询内 ...

  9. linq查询不包含某个值的记录_【翻译】C#表达式中的动态查询

    当您使用LINQ来处理数据库时,这种体验是一种神奇的体验,对吗?你把数据库实体像一个普通的收集,使用Linq中像Where,Select或者 Take,这些简单的使用就能让代码可用了. 但是,让我们考 ...

  10. Asp.Net MVC +EF(2)Linq查询和Lambda表达式

    Linq简介 Linq全称Language Integrated Query(语言集成查询),为我们提供一种统一的方式来查询和操作各种数据. linq to object:是针对实现IEnumerab ...

最新文章

  1. Android OkHttp框架解析
  2. 项目跑到到了日志警告就卡住了_java中的日志框架梳理(以故事的形式呈现)...
  3. 剑桥少儿英语预备级教案(上) unit15 I can draw it.
  4. 如何理解RESTful的幂等性
  5. SQL Server 兼容模式
  6. android手机可以设置屏幕锁定,安卓手机屏幕锁设置方法(九个点图案)
  7. php的Apa红灯_macos – 使用自制软件更新php和mysql后的apa...
  8. jquer同时选择多个不同的id执行同意操作
  9. 抖音康辉机器人_央视主持人太会玩!康辉录抖音,笑死了!
  10. 【原型图设计工具】墨刀使用说明
  11. CSDN博客成长记录
  12. Activemq配置文件详解
  13. 人工智能、机器学习、神经网络和深度学习的发展历程(下)
  14. 图像曲率 与 黎曼几何
  15. idea 回退merge_详解IDEA git分支回退指定的历史版本
  16. WIN7wifi显示无法承载
  17. 最简单的输出四位数的每个位上的数字
  18. EXCEL生成正态分布随机数据
  19. 实现Office文档的在线查看等功能
  20. SVN服务器管理工具——VisualSVN Server Manager

热门文章

  1. Redis为什么可以支持那么大的并发访问量?为什么redis没有单点并发瓶颈?
  2. Codeforces - 346A - Alice and Bob - 简单数论
  3. [C++]实现10以内整数的简单科学计算器
  4. 从C#到Swift原来这么简单,So Easy!
  5. Deep Learning 深度学习 学习教程网站集锦
  6. ORACLE纯SQL实现多行合并一行【转】
  7. PIC16F877A开发板 数码管计数器实验
  8. http 请求头回显
  9. scrapy 快速入门
  10. flux架构浅谈:什么数据才应该放store