3

datatableをilistに変換するためのコードを入手しました。これは機能するかもしれませんが、コードは私にはあまり明確ではありません。ここにコードがあります

table.AsEnumerable()
.Select(r => table.Columns.ToDictionary(c => c.ColumnName, c => r[c]))
.ToList();

table.Columns.ToDictionary()...とは何ですか。c => c.ColumnName、c =>r[c]の意味は何ですかr[c]は何を返しますか。私にはあまり明確ではありません。

私は別のスニペットを手に入れました....ここにあります

var list = new List<DataRow>();
foreach (var row in table.Rows)
   list.Add(row);

return list;

このコードは私には明らかですが、2つの異なるスニペットのうちどのコードが優れたパフォーマンスを発揮するかを知りたいです。話し合ってください。ありがとう

4

6 に答える 6

5

呼び出しはToDictionaryそれぞれをに変換DataRowし、Dictionary<string, object>これを使用して行内の任意のフィールドの値を見つけることができます。はラムダ式=>で使用される構文です。LINQでかなりの量の作業を行う場合は、ラムダ式について実際に学ぶ必要があります。

2番目のスニペットは、より単純に次のように記述されます。

var list = table.Rows.Cast<DataRow>().ToList();

効率の観点から、最初のフォームは、辞書を作成するときに行からすべてのデータをフェッチします。一部のフィールドのみを確​​認する必要がある場合は、効率が低下する可能性があります。一方で、もっと便利かもしれません。それは後でそれをどうするかによります。メモリに関しては、2番目の形式はDataRowオブジェクト自体をガベージコレクションできないことを意味しますが、最初の形式は後で行を必要としませんが、すべての実際のデータのコピーが作成されます。それがあなたの状況に関連するかどうかは、コードの残りの部分に依存します。

ただし、最初はパフォーマンスに焦点を当てません。アプリケーションの残りの部分を最も簡単に記述できるコードから始めて、それが十分に機能するかどうかを確認します。

于 2012-07-05T07:12:13.217 に答える
1

簡単に言えば、メソッドに変換されるラムダ式です。rはオブジェクトで、cはそのインデクサーです。つまり、rの配列値の1つを選択できます。例:テーブルRから列番号8を返すので、cの値は8になります。お役に立てば幸いです。

于 2012-07-05T07:15:39.080 に答える
1

結果は異なります。

短い:

  • 最初のステートメントは、辞書のリストを作成します。ここで、各キーと値のペアは列名と値です。拡張メソッドは、キーと値のToDictionary2つのパラメーターを必要とします。この例では、キーは列名(c => c.ColumnName)です。このメソッドはデータ行のColumnsコレクションで呼び出されるため、cは列です。2番目のパラメーターは、列名を取得して現在の行に挿入し、列の実際の値を示します。したがって、辞書はColumnName->Valueで構成されるKeyValuePairsでいっぱいになります。これは行ごとに行われます。その後、ToList()関数は辞書のリストを返します。
  • 2番目の例では、リストにDataRowsを入力するだけで、データテーブルのRowsコレクションを使用するよりも優れた結果は得られません。
于 2012-07-05T07:15:58.520 に答える
1

.Net Framework 3.5を使用している場合は、次のコードを試してください。

DataTable dt = new DataTable();
var list = dt.Select().ToList();
于 2013-06-17T21:54:44.930 に答える
0

コードのパフォーマンスに関しては、最初は速度を気にする必要はないという以前の投稿者に同意します。それを機能させてから、正しくしてください。

ただし、標準のforeachループとLINQの流暢な構文の間のベンチマークで私が見た(限られた)調査に基づくと、LINQは標準のforeachループよりもわずかに遅いだけです...そして小さなデータセットを処理する場合、それはわずかな量の速度低下。私は現在、時間の許す限り、この主題についていくつかの独立した統計分析を行っています。

于 2012-07-09T14:50:54.057 に答える
0

table.AsEnumerable()、2番目のコードスニペット全体と非常によく似ており、どちらでも使用できます。

コード:

.Select(r => table.Columns.ToDictionary(c => c.ColumnName, c => r[c]))
.ToList();

各テーブル行の値を使用してディクショナリを作成します。DataRowにはすでにこの機能があるため、おそらくこれはまったく必要ありません。

于 2012-07-05T07:20:58.410 に答える