質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

2111閲覧

C# datatable dataview カラム指定 重複した値を読み飛ばす

hisamoto

総合スコア17

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

1グッド

0クリップ

投稿2020/10/23 10:27

編集2020/10/23 10:46

前提・実現したいこと

c#でWindowsAppを作成しています。
主な機能は「csvファイルを読み込んでdatagridviewへ表示させる」です。

csvファイルを読み込んで、全データをdataTableへ読み込むことができました。
次に、表示する値をソートして以下のようにDataViewへ移し替えたいと考えています。

DataTable ++++++++ X Y Z ++++++++ 1 1 a 1 2 a 2 2 a 2 2 a

DataView
X列だけDistinctしてX~Zまで表示したい。

++++++++ X Y Z ++++++++ 1 1 a 2 2 a

発生している問題・エラーメッセージ

dataView.ToTableを使ってみたのですが、実際は以下のように表示されます。

++++++++ X ++++++++ 1 2

該当のソースコード

C#

1 if (dr == System.Windows.Forms.DialogResult.OK) 2 { 3 CsvPrototype csv = new CsvPrototype(openFileDialog1.FileName); 4 DataTable dataTable = csv.CsvToDataTable(); 5 6 //DataViewの作成 7 DataView dataView = dataTable.DefaultView; 8 9 //Distinctをかける 10 DataTable resultDt = dataView.ToTable(true, "X");

試したこと

以下のご質問を参考にしていたのですが、IEqualityComparerの使い方がいまいち理解できませんでした。
https://teratail.com/questions/15183

補足情報(FW/ツールのバージョンなど)

VB2007
.NET Framework 4.61

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

一応IEqualityComparerも書きましたが、LINQで十分じゃないですかね?

cs

1using System.Collections.Generic; 2using System.Data; 3using System.Linq; 4using System.Windows.Forms; 5 6namespace Questions299938 7{ 8 public partial class Form1 : Form 9 { 10 public Form1() 11 { 12 InitializeComponent(); 13 14 var dataGridView1 = new DataGridView { Dock = DockStyle.Fill, }; 15 Controls.Add(dataGridView1); 16 17 var dataTable = new DataTable(); 18 dataTable.Columns.Add("X", typeof(int)); 19 dataTable.Columns.Add("Y", typeof(int)); 20 dataTable.Columns.Add("Z"); 21 22 dataTable.Rows.Add(2, 2, "d"); 23 dataTable.Rows.Add(2, 2, "c"); 24 dataTable.Rows.Add(1, 2, "b"); 25 dataTable.Rows.Add(1, 1, "a"); 26 27 // Sort(LINQでもいいがせっかく機能があるので) 28 var view = new DataView(dataTable) { Sort = "X ASC, Y ASC, Z ASC", }; 29 var SortedTable = view.ToTable(); 30 31 // Distinct(Xでグループ化した中から1個目を採用する) 32 dataGridView1.DataSource = SortedTable.AsEnumerable() 33 .GroupBy(x => x.Field<int>("X")) 34 .Select(x => x.First()) 35 .CopyToDataTable(); 36//++++++++ 37//X Y Z 38//++++++++ 39//1 1 a 40//2 2 c 41 42 //dataGridView1.DataSource = SortedTable.AsEnumerable() 43 // .Distinct(new DataRowEqualityComparer()) 44 // .CopyToDataTable(); 45 } 46 47 //private class DataRowEqualityComparer : IEqualityComparer<DataRow> 48 //{ 49 // public bool Equals(DataRow dr1, DataRow dr2) 50 // { 51 // //return dr1["X"].ToString() == dr2["X"].ToString(); 52 // return dr1.Field<int>("X") == dr2.Field<int>("X"); 53 // } 54 55 // public int GetHashCode(DataRow dr) 56 // { 57 // //return dr["X"].GetHashCode(); 58 // return dr.Field<int>("X").GetHashCode(); 59 // } 60 //} 61 } 62}

DataTableをまともに使ったことないので、間違い・もっといい書き方があるかもしれません^^;

投稿2020/10/23 14:40

編集2023/08/15 15:29
TN8001

総合スコア9357

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hisamoto

2020/10/23 15:14 編集

ご回答ありがとうございます。以下のASCとは何を指していますか? ``` // Sort(Linqでもいいがせっかく機能があるので) var view = new DataView(dataTable) { Sort = "X ASC, Y ASC, Z ASC", }; var SortedTable = view.ToTable(); ```
hisamoto

2020/10/27 06:32

お返事遅くなってしまいました。解決しました!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問