将DataRowCollection转换为DataRow []

47 c# performance datarow datarowcollection

将DataRowCollection实例转换为DataRow []的最佳表现方式是什么?

Ely*_*Ely 97

DataRow[] rows = dt.Select();
Run Code Online (Sandbox Code Playgroud)

假设您仍然可以访问数据表.

  • 最简单的答案,也是正确的.应标记为已接受的答案.这个问题现在有3,500个观看次数! (6认同)

Nor*_*din 15

为了完整起见,这是另一种方式(使用Linq),它保留了行排序:

DataRow[] rows = dt.Rows.Cast<DataRow>().ToArray()
Run Code Online (Sandbox Code Playgroud)


Jar*_*red 5

这有点显而易见,但是:

DataRowCollection.CopyTo(DataRow[] array, Int32 offset)

似乎无论如何,你将不得不迭代集合(CopyTo迭代内部DataRowTree元素).

我想你可以使用反射访问非公共树,但成本很高.


Dei*_*lan 5

如果您无权访问包含表,则可以使用扩展方法:

public static class DataRowCollectionExtensions
{
    public static IEnumerable<DataRow> AsEnumerable(this DataRowCollection source)
    {
        return source.Cast<DataRow>();
    }
}
Run Code Online (Sandbox Code Playgroud)

之后:

DataRow[] dataRows = dataRowCollection.AsEnumerable().ToArray();
Run Code Online (Sandbox Code Playgroud)

但是,如果您有权访问包含表,则最好使用DataTableAsEnumerable扩展方法(DescriptionSource)来访问行:

DataRow[] dataRows = dataTable.AsEnumerable().ToArray();
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,您都可以将DataTableSelect方法与多个重载一起使用(DescriptionSource):

DataRow[] dataRows = dataTable.Select();
Run Code Online (Sandbox Code Playgroud)