回答編集履歴

2

ぬるり!ぬるり!

2016/12/21 09:02

投稿

tamoto
tamoto

スコア4228

test CHANGED
@@ -112,7 +112,7 @@
112
112
 
113
113
 
114
114
 
115
- public bool Equals(Person obj) => this.Name == obj.Name;
115
+ public bool Equals(Person obj) => this.Name == obj?.Name;
116
116
 
117
117
 
118
118
 

1

もう一つの解決法の提案

2016/12/21 09:02

投稿

tamoto
tamoto

スコア4228

test CHANGED
@@ -5,6 +5,10 @@
5
5
  ExceptメソッドをIEqualityComparer<T>付きで使えば良いと思います。
6
6
 
7
7
  自分の場合は以下のように書きます。
8
+
9
+
10
+
11
+ ---
8
12
 
9
13
 
10
14
 
@@ -71,3 +75,67 @@
71
75
 
72
76
 
73
77
  どうですかね?
78
+
79
+
80
+
81
+ ---
82
+
83
+
84
+
85
+ もう一つの方法として、既存のクラスに変更を加えることが可能なら、
86
+
87
+ PersonクラスにIEquatable<T>を実装し、object.Equals(object)とobject.GetHashCode()をオーバーライドすることで、Exceptの動作を意図したものにすることが可能です。
88
+
89
+
90
+
91
+ ```csharp
92
+
93
+ public class Person : IEquatable<Person>
94
+
95
+ {
96
+
97
+ public int Id { get; private set; }
98
+
99
+ public string Name { get; private set; }
100
+
101
+
102
+
103
+ public Person(int id, string name)
104
+
105
+ {
106
+
107
+ this.Id = id;
108
+
109
+ this.Name = name;
110
+
111
+ }
112
+
113
+
114
+
115
+ public bool Equals(Person obj) => this.Name == obj.Name;
116
+
117
+
118
+
119
+ public override bool Equals(object obj) => this.Equals(obj as Person);
120
+
121
+
122
+
123
+ public override int GetHashCode() => this.Name.GetHashCode();
124
+
125
+ }
126
+
127
+ ```
128
+
129
+
130
+
131
+ ```csharp
132
+
133
+ var diffList = local.Except(web);
134
+
135
+ ```
136
+
137
+
138
+
139
+ この場合、`Name`が同じである`Person`は本当に「同じモノである」として扱われることになるので、それによって何か不都合が生じないように注意する必要があります。
140
+
141
+