teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

見直しキャンペーン中

2023/08/15 15:29

投稿

TN8001
TN8001

スコア10111

answer CHANGED
@@ -1,4 +1,4 @@
1
- 一応`IEqualityComparer`も書きましたが、Linqで十分じゃないですかね?
1
+ 一応`IEqualityComparer`も書きましたが、LINQで十分じゃないですかね?
2
2
 
3
3
  ```cs
4
4
  using System.Collections.Generic;
@@ -27,7 +27,7 @@
27
27
  dataTable.Rows.Add(1, 2, "b");
28
28
  dataTable.Rows.Add(1, 1, "a");
29
29
 
30
- // Sort(Linqでもいいがせっかく機能があるので)
30
+ // Sort(LINQでもいいがせっかく機能があるので)
31
31
  var view = new DataView(dataTable) { Sort = "X ASC, Y ASC, Z ASC", };
32
32
  var SortedTable = view.ToTable();
33
33
 

1

見直しキャンペーン中

2023/07/23 08:25

投稿

TN8001
TN8001

スコア10111

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