如果 DataRowCollection 的基类派生自 IEnumerable<T>,为什么不能在 DataRowCollection 上使用 LINQ

mon*_*tix 5 .net c# linq

我发现不可能直接在IEnumerable<T>ie实例上使用 LINQSystem.Data.DataRowCollection

System.Data.InternalDataCollectionBase这个类派生自实现 的类IEnumerable<T>,因此能够使用 LINQ 函数是完全有意义的System.Data.DataRowCollection......但我不能。

检查以下示例:

using (DBConnection connExport = DBConnection.OpenConnection())
{
    DataTable dt = GetDataTableFromDatabase();

    DataRow dr1 = dt.Rows.First(); // This LINQ is not allowed
    foreach(DataRow dr in dt.Rows) // But enumerating it works fine
    {
            // Some processing...
    }
}
Run Code Online (Sandbox Code Playgroud)

我搜索了LINQ 的官方文档, 发现了

标准查询运算符允许将查询应用于任何基于枚举的信息源。

我知道原因应该很简单,但我不知道是什么。所以我来了:

为什么 LINQ for 实例不允许System.Data.DataRowCollection

[编辑]:已经有一个如何克服这个问题的答案,但没有答案,所以这就是我的目的:理解,而不是克服。

Sal*_*ari 6

它的类型System.Collections.IEnumerable不是IEnumerable<T>,但您可以在此处使用CastOfType使用 LINQ:

DataRow dr1 = dt.Rows.Cast<DataRow>().First(); 
Run Code Online (Sandbox Code Playgroud)

  • 作为替代方案,您可以包含“System.Data.DataSetExtensions.dll”,然后只需执行“dt.AsEnumerable().First()” (3认同)