C# で DataTable から DISTINCT な値を取得する

DataTable から DISTINCT な値を取得する

DataTable に値が入っていて、その中の特定のカラムの DISTINCT な値を取得したいような時ありませんか?

データベース側でやるならば SELECT DISTINCT [カラム名1], [カラム名2] FROM [テーブル名] ... のような感じで簡単にできますよね。

ここでは、C# 側で DataTable から DISTINCT な値を取得して、その結果を DataTable として取得したい際に使えるコードをご紹介します。


例えば以下のような dt という名前の DataTable があるとします。

C# で DataTable から DISTINCT な値を取得する 1

この中で、Department カラムと GroupName カラムの DISTINCT な値を持つ DataTable を取得してみましょう。

DataView の ToTable メソッドを使う

Linq を使ったり、いろいろな方法があるかと思いますが、ここでは DataViewToTable メソッドを使います。

構文は DataView.ToTable (Boolean, String[]) で、一つ目の引数に true を渡すことで、String[] で指定したカラムの DISTINCT な値を持つ新しい DataTable を取得することができます。


先ほどの dt という名前の DataTable から次のコードで、 Department カラムと GroupName カラムの DISTINCT な値を持つ DataTable を取得することができます。

DataTable dtDistinct = dt.DefaultView.ToTable(true, "Department", "GroupName");

C# で DataTable から DISTINCT な値を取得する 2

dt の DefaultView の ToTable メソッドを使っています。

Department カラムと GroupName カラムの DISTINCT な値を持つ DataTable が取得できていますね。


また、取得できるテーブルは、dt.DefaultView.RowFilter で指定したフィルターが効きますので、必要に応じて設定してください。

C# で DataTable から DISTINCT な値を取得する 3

ちなみに ToTable メソッドは、 dt のレコードが 0 行であったり、dt.DefaultView.RowFilter の結果が 0 行の場合も、 0 行のテーブルが返ってくるだけでエラーになりません。

© 2024 C# 入門