■ はじめに
DataTable の Comput()メソッドでは、「Distinct」や「GROUP BY」を使用することができない。 DataTableでの重複した値を省くには、方法について考える
【1】DataView の ToTable メソッドを使う
* DataView.ToTable (true, "項目1", "項目2"...) で可能[[https://docs.microsoft.com/ja-jp/dotnet/api/system.data.dataview.totable?view=netframework-4.7.2#System_Data_DataView_ToTable_System_Boolean_System_String___]]
サンプル
using System; using System.Data; using System.Windows.Forms; namespace SampleForm { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { var dataTable = new DataTable(); dataTable.Columns.Add("area", typeof(string)); dataTable.Columns.Add("prefecture", typeof(string)); dataTable.Columns.Add("city", typeof(string)); dataTable.Rows.Add("Kanto", "Tokyo", "Setagaya"); dataTable.Rows.Add("Kanto", "Tokyo", "Shibuya"); dataTable.Rows.Add("Kanto", "Tokyo", "Nakano"); dataTable.Rows.Add("Kanto", "Kanagawa", "Yokohama"); dataTable.Rows.Add("Kanto", "Kanagawa", "Kawasaki"); dataTable.Rows.Add("Kanto", "Saitama", "Saitama"); dataTable.Rows.Add("Kanto", "Saitama", "Fukaya"); dataTable.Rows.Add("Kanto", "Saitama", "Koshigaya"); dataTable.Rows.Add("Kanto", "Saitama", "Kawaguchi"); dataTable.Rows.Add("Kyushu", "Fukuoka", "Fukuoka"); dataTable.Rows.Add("Kyushu", "Nagasaki", "Nagasaki"); dataTable.Rows.Add("Kyushu", "Kagoshima", "Kagoshima"); var resultDataTableForArea = dataTable.DefaultView.ToTable(true, "area"); this.dataGridView1.DataSource = resultDataTableForArea; var resultDataTableForPrefecture = dataTable.DefaultView.ToTable(true, "prefecture"); this.dataGridView2.DataSource = resultDataTableForPrefecture; this.label1.Text = "Done!"; } } }
出力結果
area ------- Kanto Kyushu prefecture ------- Tokyo Kanagawa Saitama Fukuoka Nagasaki Kagoshima
補足
* 以下の関連記事でも使用しているhttps://blogs.yahoo.co.jp/dk521123/37979233.html
【2】ループで地道に実装する
* Listのメソッド Contains() を使って、実装する
サンプル
・・・ DataSet ds = new DataSet(); DataTable dt = new DataTable(); ・・・ List<string> list = new List<string>(); if (dataTable.Rows != null) { // Rowでループ foreach (dataSet1.dataRow row in dataTable.Rows) { // Id が存在し、重複ではないものを、リストに格納 if (!row.IsIdNull() && !list.Contains(row.Id)) { list.Add(row.Id); } } } } } int total = list.Count; ・・・
関連記事
DataTable関連
DataTable ~ あれこれ編 ~https://blogs.yahoo.co.jp/dk521123/20413895.html
DataTable ~ 重複を気にせずカウントするには... ~
https://blogs.yahoo.co.jp/dk521123/31382607.html
DataSet / DataTable ~ データテーブルのソート ~
https://blogs.yahoo.co.jp/dk521123/15231236.html
DataSet と TableAdapter について
https://blogs.yahoo.co.jp/dk521123/10415992.html