DataRowCollectionインスタンスをDataRow []に変換する最もパフォーマンスの良い方法は何ですか?
DataRow[] rows = dt.Select();
まだデータテーブルにアクセスできると仮定します。
完全を期すために、これは別の方法(Linqを使用)であり、行の順序を維持する:
DataRow[] rows = dt.Rows.Cast<DataRow>().ToArray()
これは一種の明らかですが、次のとおりです。
DataRowCollection.CopyTo(DataRow[] array, Int32 offset)
?
何があっても、コレクションを反復処理する必要があるようです(CopyToは内部DataRowTree要素を反復処理します)。
リフレクションを使用して非公開ツリーにアクセスできると思いますが、かなりのコストがかかります。
含まれているテーブルにアクセスできない場合は、拡張メソッドを使用できます。
public static class DataRowCollectionExtensions
{
public static IEnumerable<DataRow> AsEnumerable(this DataRowCollection source)
{
return source.Cast<DataRow>();
}
}
そしてその後:
DataRow[] dataRows = dataRowCollection.AsEnumerable().ToArray();
ただし、含まれているテーブルにアクセスできる場合は、DataTable
のAsEnumerable
拡張メソッド(- Description 、 Source )を使用して行にアクセスすることをお勧めします。
DataRow[] dataRows = dataTable.AsEnumerable().ToArray();
どちらの方法でも、DataTable
のSelect
メソッドをいくつかのオーバーロード( 説明 、 ソース )と共に使用できます。
DataRow[] dataRows = dataTable.Select();