[C#] 比對兩個物件是否相等(利用Property)

  • 2573
  • 0
  • 2017-02-02

[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來比對兩個物件囉~

更多的比對方式

[C#.NET] 利用序列化 比較兩物件是否相等

參考資料

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 授權條款


本著作係採用創用 CC 姓名標示-非商業性-相同方式分享 4.0 國際 授權條款授權.