List<T>などでTが参照型の場合、ContainsやIndexOfは値(オブジェクト内容)ではなく、参照先を判定する仕様となっている。
これを、値(オブジェクト内容)で判定させたい場合はどうするのかというと、T型にIEquatable<T>インターフェースをインプリメントして、Equalsメソッドを定義して上げれば良い。
// ノーマルバージョン
public class Person {
public string Name { get; set; }
public string Mail { get; set; }
}
var p = new Person() { Name = "T.Sumomo", Mail = "t.sumomo@momo.com" };
var p1 = new Person() { Name = "T.Sumomo", Mail = "t.sumomo@momo.com" };
p == p1
p.Equals(p1)
List<Person> l1 = new List<Person>() { p };
l1.Contains(p1)
l1.IndexOf(p1)
// 値比較バージョン
public class Person1 : IEquatable<Person1> {
public string Name { get; set; }
public string Mail { get; set; }
// 値で比較
public bool Equals(Person1 other) {
return other?.Name == Name && other?.Mail == Mail;
}
}
var p2 = new Person1() { Name = "T.Sumomo", Mail = "t.sumomo@momo.com" };
var p3 = new Person1() { Name = "T.Sumomo", Mail = "t.sumomo@momo.com" };
p2 == p3
p2.Equals(p3)
List<Person1> l2 = new List<Person1>() { p2 };
l2.Contains(p3)
l2.IndexOf(p3)> p == p1
false
> p.Equals(p1)
false
> l1.Contains(p1)
false
> l1.IndexOf(p1)
-1
>
> p2 == p3
false
> p2.Equals(p3)
true
> l2.Contains(p3)
true
> l2.IndexOf(p3)
0と、このように値で判定を行う事ができる。
もちろん、内容全部を比較するのでは無く、キーとなるプロパティだけの比較とかでも問題は無い。
ちなみに、Equalsではなく、== operatorをEqualsと同じ内容にしても、ContainsやIndexOfは参照先の比較になってしまう。
まぁ、わざわざクラスに手を入れないで、LINQ使ってもいいのだけど・・・






Users Today : 39
Users Yesterday : 44
Users Last 7 days : 233
Users Last 30 days : 1002
Users This Month : 842
Users This Year : 15668
Total Users : 93472
Views Today : 50
Views Yesterday : 53
Views Last 7 days : 288
Views Last 30 days : 1274
Views This Month : 1050
Views This Year : 21255
Total views : 131190
Who's Online : 0