【问题标题】:Understanding AsEnumerable in Linq to Objects [closed]了解 Linq to Objects 中的 AsEnumerable [关闭]
【发布时间】:2014-05-19 08:50:34
【问题描述】:

写在msdn上:

返回输入为IEnumerable<T>

我不明白。 帮助我理解这个方法。

【问题讨论】:

  • Jon Skeet 在 Linq to Objects 上做了一个出色的系列。这是Part 36 - AsEnumerable
  • @Jodrell 抱歉,我已经通过同意然后改变主意来抹去你的近距离投票;那不是我的本意。
  • @Rawling,看来我无法恢复投票:-S。没关系。
  • 这是一个简单的(也许不是那么典型)的例子:List<int> li = XXX; var reversedWithLinq = li.AsEnumerable().Reverse();AsEnumerable 的含义是“隐藏”除IEnumerable<> 之外的实际类型或接口定义的其他重载,以确保使用的重载来自IEnumerable<> 的扩展。如果您从我的示例中删除 .AsEnumerable(),它将无法编译,因为其他方法返回 void

标签: c# asenumerable


【解决方案1】:

AsEnumerable 的三种实现方式。

DataTableExtensions.AsEnumerable

扩展 DataTable 以为其提供 IEnumerable 接口,以便您可以针对 DataTable 使用 Linq。

Enumerable.AsEnumerable<TSource>ParallelEnumerable.AsEnumerable<TSource>

AsEnumerable<TSource>(IEnumerable<TSource>) 方法无效 除了将源的编译时类型从一个类型更改为 实现 IEnumerable<T>IEnumerable<T> 本身。

AsEnumerable<TSource>(IEnumerable<TSource>)可以用来选择 序列实现时的查询实现之间 IEnumerable<T> 但也有一组不同的公共查询方法 可用的。例如,给定一个泛型类Table,它实现 IEnumerable<T> 并有自己的方法如WhereSelectSelectMany,对 Where 的调用将调用公共的 Where 方法 Table。表示数据库表的 Table 类型可以有 Where 将谓词参数作为表达式树的方法 并将树转换为 SQL 以进行远程执行。如果远程执行 不需要,例如因为谓词调用本地 方法,AsEnumerable<TSource> 方法可以用来隐藏 自定义方法,而不是使用标准查询运算符 可用。

换句话说。

如果我有一个

IQueryable<X> sequence = ...;

来自 Linq 提供程序,例如 Entity Framework,我也这样做,

sequence.Where(x => SomeUnusualPredicate(x));

该查询将在服务器上编写和运行。这将在运行时失败,因为 Entity Framework 不知道如何将 SomeUnusualPredicate 转换为 SQL。

如果我希望它改为使用 Linq to Objects 运行语句,我会这样做,

sequence.AsEnumerable().Where(x => SomeUnusualPredicate(x));

现在服务器将返回所有数据,并且将使用来自 Linq to Objects 的Enumerable.Where,而不是查询提供程序的实现。

Entity Framework 不知道如何解释SomeUnusualPredicate 没关系,我的函数将被直接使用。 (但是,这可能是一种低效的方法,因为所有行都将从服务器返回。)

【讨论】:

    猜你喜欢
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    相关资源
    最近更新 更多