web-dev-qa-db-ja.com

DataRowCollectionをDataRow []に変換します

DataRowCollectionインスタンスをDataRow []に変換する最もパフォーマンスの良い方法は何ですか?

46
Jeff
DataRow[] rows = dt.Select();

まだデータテーブルにアクセスできると仮定します。

96
Ely

完全を期すために、これは別の方法(Linqを使用)であり、行の順序を維持する

DataRow[] rows = dt.Rows.Cast<DataRow>().ToArray()
14
Nordin

これは一種の明らかですが、次のとおりです。

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

何があっても、コレクションを反復処理する必要があるようです(CopyToは内部DataRowTree要素を反復処理します)。

リフレクションを使用して非公開ツリーにアクセスできると思いますが、かなりのコストがかかります。

5
Jared

含まれているテーブルにアクセスできない場合は、拡張メソッドを使用できます。

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

そしてその後:

DataRow[] dataRows = dataRowCollection.AsEnumerable().ToArray();

ただし、含まれているテーブルにアクセスできる場合は、DataTableAsEnumerable拡張メソッド(- DescriptionSource )を使用して行にアクセスすることをお勧めします。

DataRow[] dataRows = dataTable.AsEnumerable().ToArray();

どちらの方法でも、DataTableSelectメソッドをいくつかのオーバーロード( 説明ソース )と共に使用できます。

DataRow[] dataRows = dataTable.Select();
5
Deilan