データテーブルをLINQを使用してList・HashSet・Dictionaryに変換する
DataTableを使わなくてもList・HashSet・Dictionaryで解決することが多いので、データテーブルからそれぞれの型に変更する方法をまとめておきます。
サンプルの注意書き
- x.Field(“column1”)の”column1″がDataTableのカラム名に当たります
- サンプルはすべてstring型になっていますが、数値型でも基本的に同じ方法で変換できます
Listに変換する
DataTableを単純な文字列のListに変換します。
// データテーブルをList<string>に変換する
List<string> _list = new List<string>(_dataTable.AsEnumerable()
.Select(x => x.Field<string>("column1")));
HashSetに変換する
DataTableをHashSetに変換します。
LINQで指定したDataTable項目に同じ値がある場合はHashSetによって重複が排除されます。
// データテーブルをHashSet<string>に変換する
HashSet<string> _hashSet = new HashSet<string>(_dataTable.AsEnumerable()
.Select(x => x.Field<string>("column1")));
2つの値をセットで扱いたい場合はTuple型のHashSetが便利です。
同じ組み合わせの値が存在する場合は重複が排除されます。
// データテーブルをHashSet<Tuple<string,string>>に変換する
HashSet<Tuple<string, string>> _hashSet2 = new HashSet<Tuple<string, string>>(
_dataTable.AsEnumerable()
Select(x => new Tuple<string, string>(
x.Field<string>("column1"), x.Field<string>("column2"))));
Dictionaryに変換する
DictionaryはList・HashSetとは少し方法が異なります。
DataTableからAsEnumerableメソッドを呼び出してToDictionaryメソッドでDictionaryに変換し、DataTableの項目名を指定します。
また、キー項目に重複がある場合はエラーが発生しますので注意が必要です。
// Dictionary<string,string>に変換する
Dictionary<string, string> _dictionary = _dataTable.AsEnumerable().ToDictionary( x => x.Field<string>("column1"), x => x.Field<string>("column2"));
まとめ
以上がデータテーブルをLINQでList・HashSet・Dictionaryに変換する方法です。
データベースを使用するときはEntityFrameworkを使えばDataTableなんて使用しなくて済むのですが…
DataTableはLINQでサクッっとデータを取得できない(やりづらい)のがストレスです。
そもそも上記の方法を使う必要がないプログラムが一番なのですが、既存プログラムの修正で必要になることがあるのでご参考までに。
コメント