我们来看看以下程序吧:

01:  using System;
02:  using System.Data;
03:  using System.Linq;
04:
05:  namespace Skyiv.Ben
06:  {
07:    class Program
08:    {
09:      static void Main()
10:      {
11:        var dt = new DataTable();
12:        dt.Rows.Add();
13:        foreach (var row in dt.Select())
14:        {
15:          Console.WriteLine(row.GetType());
16:          Console.WriteLine(row.RowState);
17:        }
18:      }
19:    }
20:  }

上述程序中第 12 行中的 DataTable 类的 Rows 属性的类型为 DataRowCollection 类。第 13 行中的 DataTable 类的 Select 方法返回 DataRow[] 数组。我们知道,foreach 语句对实现 System.Collections.IEnumerable 或 System.Collections.Generic.IEnumerable<T> 接口的数组或对象集合中的每个元素重复一组嵌入式语句。所以该 foreach 语句中的 row 变量的类型被推断为 DataRow 类。这个程序的运行结果如下所示:

System.Data.DataRow
Added

如果把上述程序中的第 13 行改为:

13:        foreach (var row in dt.Rows)

这时,会出错以下编译错误:

Program.cs(16,31): error CS1061:“object”不包含“RowState”的定义,并且找不到可接受类型为“object”的第一个参数的扩展方法“RowState”(是否缺少 using 指令或程序集引用?)

这是因为 DataRowCollection 类只实现了 System.Collections.IEnumerable 接口,而没有实现 System.Collections.Generic.IEnumerable<DataRow> 接口,所以该 foreach 语句中的 row 变量的类型被推断为 System.Object 类。

仅实现 IEmnumerable 接口而没有实现 IEnumerable<T> 接口的集合类还有非常多,例如:

  • System.Data.DataColumnCollection
  • System.Data.ConstraintCollection
  • System.Data.Common.DataTableMappingCollection
  • System.Windows.Forms.DataGridViewRowCollection
  • System.Web.UI.WebControls.GridViewRowCollection

因为泛型是在 .NET 2.0 中才引入的,上述类中的大部分都是在 .NET 1.0 中已经就有了。但是 Microsoft 应该在 .NET 2.0 以后为上述类实现 IEnumerable<T> 接口才对。这不能不说是 .NET Framework Base Class Library 的一个遗憾。请参阅 MSDN 论坛上的一个相关的帖子:Missing linq extension method 。

幸运的是,在 .NET Framework 3.5 及其以后的版本中, 在 System.Linq 命名空间中增加了 IEnumerable.Cast<TResult> 扩展方法,可以将 IEnumerable 的元素转换为指定的 TResult 类型。这样,上述程序第 13 行改为:

13:        foreach (var row in dt.Rows.Cast<DataRow>())

就可以正常工作了。当然,在这个场合还有更好的解决方案,就是将第 13 行改为:

13:        foreach (DataRow row in dt.Rows)

就可以了。

也有好消息,就是 System.Collections.ObjectModel 命名空间中的 Collection<T> 类实现了 IEnumerable<T> 接口,而 Collection<T> 类有很多派生类。例如 System.Net 命名空间中的 IPEndPointCollection 类就是从 Collection<IPEndPoint> 类继承,因此也就实现了 IEnumerable<IPEndPoint> 接口。

参考资料

  1. Missing linq extension method
  2. MSDN: foreach, in (C# Reference)
  3. MSDN: DataRowCollection 类(System.Data)
  4. MSDN: IPEndPointCollection 类(System.Net)
  5. MSDN: Collection(T) 类(System.Collections.ObjectModel)
  6. MSDN: IEnumerable 接口(System.Collections)
  7. MSDN: IEnumerable(T) 接口(System.Collections.Generic)
  8. MSDN: Enumerable.Cast(TResult) 方法(System.Linq)

浅谈 System.Data.DataRowCollection 类相关推荐

  1. 浅谈String和StringBuffer类:

    浅谈String和StringBuffer类: 如果有错误的地方,请多多提出! 内存分配: String(固定字符串): String类对象一旦创建,内容无法修改. String a="3& ...

  2. 真·浅谈System.setOut()

    java中我们熟悉的输出System.out.println()只能将数据输出到控制台上,那么我们像要将数据输出到背的地方时该怎么办? System.setOut()来了. System.out是 S ...

  3. java 匿名类_浅谈Java的匿名类

    在实际的项目中看到一个很奇怪的现象,Java可以直接new一个接口,然后在new里面粗暴的加入实现代码.就像下面这样.那么问题来了,new出来的对象没有实际的类作为载体,这不是很奇怪吗? 思考以下代码 ...

  4. java vector addall_浅谈java.util.Vector类的add()和addAll()方法

    这两天学习Java.util.Vector类,开始被add()和addAll()这两个方法搞晕了, 经过自己的努力终于明白了,现在以实例说明: 现有两个Vector类实例分别为Vector1和Vect ...

  5. 浅谈管理软件开发类项目是怎么来的,怎么接到项目的,欢迎大家补充

    为什么80%的码农都做不了架构师?>>>    其实很多人问过我,吉日你的软件项目都是哪里来的?为啥你有做不完的软件项目? 我也简单理了一下思路,跟大家一起分享一下: 01: 首先你 ...

  6. PHP项目异常类该如何设计,浅谈 PHP 中异常类的使用

    更加符合语义化 异常类往往都有自己的名字,在函数调用层面,即使不进入函数内部也能够通过异常名来判断调用函数会伴有哪些异常,如果函数没有异常,返回的是 false 或 true ,这会让函数的调用者非常 ...

  7. [Extjs6]浅谈Ext.data.Store的使用.

    定义model Ext.define('Example.model.Contact', {extend: 'Ext.data.Model',fields: ['id', 'name', 'phone' ...

  8. 站长说说之SEO中浅谈如何做好新闻类网站的优化

    网站的类型有很多,而不同类型的网站优化所需要的技巧也不一而足,那么对于新闻类网站来说,怎么做优化比较好呢?别着急,今天就为大家分享几点. 首先还是原创.原创可以适用于所有类型的网站,有原创就与了一个良 ...

  9. 浅谈医药工业洁净类厂房智能照明设计与选型

    摘 要:结合工程设计实践,介绍医药工业洁净厂房照明系统的总体设计思路,探讨工程设计中需关注的照明供电.照度标准.光源及灯具选择等技术问题,并对门厅.人流入口.生产房间.技术夹层及实验室等场所的照明设计 ...

最新文章

  1. java基础入门传智播客 源码_Java-_2020年版Java零基础视频教程(Java 0基础,Java初学入门)魔鬼讲师老杜出品...
  2. Yii2掉index.php?r=
  3. 算法就是这么一回事(排序)(第二部分)
  4. 手把手部署Linux下磁盘配额(quota)应用与实战
  5. cnblogs_504 Gateway Time-out
  6. LightSwitch社区资源搜集
  7. sql server只读_如何在SQL Server 2016中为可用性组配置只读路由
  8. 接触线叉环插座行业调研报告 - 市场现状分析与发展前景预测
  9. 2018年php框架,2018年的7个热门网站开发框架
  10. sklearn学习笔记(3)svm多分类
  11. 横向移动-WINRM
  12. ARM与RISC-V架构有哪些区别?
  13. MDP 与 贝尔曼方程
  14. 程序员必备的几个图标网站
  15. 软件测试寻找测试点的思维角度有哪些方面?
  16. 公司副总请各部门经理喝酒,事后有些经理汇报给了老板,没汇报的反而被打压,你怎么看?...
  17. 企业网站建设的要求及策划
  18. SpringBoot与Restful风格
  19. 三条命令搞定Winload.exe出现0xc000000e错误
  20. WikiTaxinbsp;离线中英文维基百科数据…

热门文章

  1. mysql io 100_MySQL服务器 IO 100%的分析与优化方案
  2. 八城联动 丨 神策 2020 数据驱动用户大会「杭州站」邀您赴约!
  3. 数据绑定(三)为Binding指定绑定源的几种方法
  4. Springmvc的handler method参数绑定常用的注解
  5. SQL ALTER TABLE 语句
  6. 13-3 14 NFS
  7. iOS如何随意的穿插跳跃,push来pop去
  8. org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter错误解决
  9. SQL Server数据库备份的镜像
  10. createSQLQuery的addEntity跟setResultTransformer方法