[C#] 比對兩個Model物件是否相等
當遇到這種需求
多數人很直覺的就是用Equals
冷靜!!! 各位沒有想過物件在比對的時候是比對參考(Reference)位置呢?
我們看看下面這段程式(本程式來自此連結)
Person person1a = new Person("John");
Person person1b = person1a;
Person person2 = new Person(person1a.ToString());
Console.WriteLine("Calling Equals:");
Console.WriteLine("person1a and person1b: {0}", person1a.Equals(person1b)); // True
Console.WriteLine("person1a and person2: {0}", person1a.Equals(person2)); // False
Console.WriteLine("\nCasting to an Object and calling Equals:");
Console.WriteLine("person1a and person1b: {0}", ((object) person1a).Equals((object) person1b)); // True
Console.WriteLine("person1a and person2: {0}", ((object) person1a).Equals((object) person2)); // False
為何person1a.Equals(person2)
跟((object) person1a).Equals((object) person2)
會是False呢?
有注意到這段嗎?Person person2 = new Person(person1a.ToString());
因為person是new出來的,表示他是一個全新的物件
雖然他們倆個都是"John"
其實他們只是剛好都叫做John而已,實際上是不同的物件(兩個不同個體)
但你說,一樣都是John,你怎麼可以給我不相等?我就是要他們相等阿
這個時候就要比對內容了...
var props = typeof(Person).GetProperties(); // 取得該物件內所有的Property
var notEqualCount = 0;
foreach (var prop in props)
{
var value1 = prop.GetValue(person1a);
var value2 = prop.GetValue(person2);
if (value1 != value2) // 這段如果prop的屬性是object的話又會回到最前面的那個問題了,所以暫時忽略
{
notEqualCount++;
}
}
// 如果notEqualCount > 0則兩個物件為不相等
PS:上面程式沒有執行過,可能會有錯誤,不過概念大概是這樣
接著再把這段複寫至Person的Equals內
就可以用person1a.Equals來比對兩個物件囉~
更多的比對方式
參考資料
https://msdn.microsoft.com/zh-tw/library/bsc2ak47(v=vs.110).aspx
https://msdn.microsoft.com/zh-tw/library/system.type(v=vs.110).aspx
如有任何問題,歡迎討論指教
Write By Charley Chang
新手發文,若有錯誤還請指教,
歡迎留言或Mail✉給我
本著作係採用創用 CC 姓名標示-非商業性-相同方式分享 4.0 國際 授權條款授權.