C# で DataTable から DISTINCT な値を取得する
DataTable から DISTINCT な値を取得する
DataTable に値が入っていて、その中の特定のカラムの DISTINCT な値を取得したいような時ありませんか?
データベース側でやるならば SELECT DISTINCT [カラム名1], [カラム名2] FROM [テーブル名] ... のような感じで簡単にできますよね。
ここでは、C# 側で DataTable から DISTINCT な値を取得して、その結果を DataTable として取得したい際に使えるコードをご紹介します。
例えば以下のような dt という名前の DataTable があるとします。
この中で、Department カラムと GroupName カラムの DISTINCT な値を持つ DataTable を取得してみましょう。
DataView の ToTable メソッドを使う
Linq を使ったり、いろいろな方法があるかと思いますが、ここでは DataView の ToTable メソッドを使います。
構文は DataView.ToTable (Boolean, String[]) で、一つ目の引数に true を渡すことで、String[] で指定したカラムの DISTINCT な値を持つ新しい DataTable を取得することができます。
先ほどの dt という名前の DataTable から次のコードで、 Department カラムと GroupName カラムの DISTINCT な値を持つ DataTable を取得することができます。
DataTable dtDistinct = dt.DefaultView.ToTable(true, "Department", "GroupName");
dt の DefaultView の ToTable メソッドを使っています。
Department カラムと GroupName カラムの DISTINCT な値を持つ DataTable が取得できていますね。
また、取得できるテーブルは、dt.DefaultView.RowFilter で指定したフィルターが効きますので、必要に応じて設定してください。
ちなみに ToTable メソッドは、 dt のレコードが 0 行であったり、dt.DefaultView.RowFilter の結果が 0 行の場合も、 0 行のテーブルが返ってくるだけでエラーになりません。