【C#】DataTable ~ DISTINCT / 重複した値を省くには... ~

■ はじめに

 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