web-dev-qa-db-ja.com

DataTableから1つの列の値のリストを取得する方法

DataTableがあります。

DataTable dt = new DataTable();

dt.Columns.Add(new DataColumn("id", Type.GetType("System.Int32")));
dt.Columns.Add(new DataColumn("name", Type.GetType("System.String")));
// more columns here

「id」値のリストが必要です。

ループなし DataTableのすべての行に対してLinqなしを実行できますか?

編集:

セルゲイとの小さな議論の後、とにかくループを使うことにしました。

40
Kamil

Linq to DataTableを使用できます。

var ids = dt.AsEnumerable().Select(r => r.Field<int>("id")).ToList();

更新:Linqなし

List<int> ids = new List<int>(dt.Rows.Count);
foreach(DataRow row in dt.Rows)
    ids.Add((int)row["id"]);

効率を上げるために、row[index]ではなくrow[columnName]を使用することをお勧めします。最初のものは、列配列からインデックスによって列を取得するだけです。 Latterは、名前をインデックスにマップする内部ディクショナリから列のインデックスを取得し、その後、インデックスごとに列を取得します。

注意すべきもう1つのことは、行数を使用してリストの容量を初期化することです。これを行わない場合、リストの内部配列が何度も再作成およびコピーされます(行数によって異なります)。

そして最後に言うと-巨大なテーブル(可能な場合)で最も効率的な方法は、サーバー側でデータをフィルタリングすることです。

73