【问题标题】:What is the purpose of the EnumerableRowCollection<TRow> class?EnumerableRowCollection<To> 类的目的是什么?
【发布时间】:2015-11-11 16:16:28
【问题描述】:

正如文档DataTable.AsEnumerable()中所述

返回一个 IEnumerable 对象,其中泛型参数 T 是 DataRow。此对象可用于 LINQ 表达式或方法查询。

AsEnumerable() 的返回类型不仅仅是IEnumerable&lt;DataRow&gt; 它也是EnumerableRowCollection&lt;DataRow&gt;

为什么会有这种类型?与仅提供 IEnumerable&lt;DataRow&gt;DataTable.Rows.Cast&lt;DataRow&gt;() 相比,它提供了什么好处?

【问题讨论】:

  • 我猜差异在框架之外不可见/不重要,因为一切都是privateinternalHere可以看到实现细节。
  • 我不是数据集专家,因为我通常会尽量避免它,但快速浏览一下源似乎表明它对数据集的排序和过滤做了一些特殊的事情,而 IEnumerable&lt;DataRow&gt; 会不是。
  • 你正在使用来自System.Data命名空间的AsEnumerable扩展方法,而不是来自System.Linq

标签: .net linq datatable


【解决方案1】:

EnumerableRowCollection&lt;TRow&gt; 那里的页面 是几个扩展方法,它们专门从这里获取并返回一个EnumerableRowCollection&lt;TRow&gt; 我假设这些方法有DataTable 特定的实现,当简单地使用IEnumerable&lt;DataRow&gt; 时不能使用它们

我还发现了这个blog post 声明

为了使 LinqDataView 在不使用 IQueryable 的情况下工作(出于性能原因,我们不想这样做),我们必须保留实现类。只要使用 EnumerableRowCollection 实例而不是实现 IEnumerable 的“某物”,我们就可以将每个 LINQ 运算符捕获到状态包中,这样我们就可以在 DataView 中重新创建 LINQ 查询的效果。

我曾认为 LINQ-To-Objects 涵盖了 LINQ 与 IEnumerables 的任何使用,而其他任何东西都意味着使用了 IQueryables,但我想事实并非如此。 IQueryable&lt;T&gt; 也实现了 IEnumerable&lt;T&gt;,但它比 DataRowCollection&lt;TRow&gt;许多更多可用的 IQueryable 特定扩展方法

【讨论】:

    猜你喜欢
    • 2010-12-17
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 2010-09-07
    • 2012-07-09
    相关资源
    最近更新 更多