2011-09-27 41 views
1

這些是兩個相同的對象,但我的情況正在進入else塊。如何比較兩個對象的值是否相同?如何使用asp.net mvc比較兩個對象

baObject b = new baObject(); 
baObject b1 = new baObject(); 
if (object.Equals(b, b1)) 
{ 
    // Equal 
} 
else 
{ 
    // not equal 
} 

這種行爲呢。

var t1 = repo.Model_Test_ViewAllBenefitCodes(2) 
     .OrderBy(p => p.ba_Object_id) 
     .ToArray();//.FirstOrDefault(); 
var t2 = x.ViewAllBenefitCodes 
     .OrderBy(p => p.ba_Object_id) 
     .ToArray();//.FirstOrDefault(); 

這裏t1和t2是相同的對象,但從兩個不同的方法或函數中獲得。

+1

定義*'same' *? –

+0

t1和t2不是同一個對象。對象標識使用參考比較而不是數值比較。如果你想有價值比較,你需要重載Equals和==和/或實現Icomparable 或類似的接口 –

回答

2

默認情況下,您正在處理引用等式。因此,在引用相等的情況下,它將檢查實際上是否具有相同的對象 - 這意味着b和b1在內存中是相同的對象,而不僅僅是等價的,無論對於baObject而言。

See this MSDN Reference

可以接近該參考MSDN的底部,你可以定義自己的實現操作者看到==這樣你可以這樣做:

if (a1 == a2) 

,其中A1和A2您創建的某種類型的對象。無論是什麼讓他們等同於你 - 例如,如果他們有某些你可以比較的屬性。

返回引用相等 - 如果你願意做這樣的事情:

baObject b = new baObject(); 
baObject b1 = b; 
if (object.Equals(b, b1)) 

,因爲B和B1是將評估爲真,其實是同一個對象。但是由於這可能不是你所追求的,所以你可以爲baObject類定義operator ==,然後比較它們是否相等。你可以這樣做:

public static bool operator ==(baObject b1, baObject b2) { 
    return b1.foo == b2.foo && b1.bar == b2.bar; 
} 

定義什麼等價意味着您baObject。

+0

感謝itsmatt,如果我有這種類型的情況怎麼樣。 var t1 = repo.Model_Test_ViewAllBenefitCodes(2).OrderBy(p => p.ba_Object_id).ToArray(); //。FirstOrDefault(); var t2 = x.ViewAllBenefitCodes.OrderBy(p => p.ba_Object_id).ToArray(); //。FirstOrDefault(); – user957178

+0

* * t1和t2是否相同?你是什​​麼意思?再次,您可以比較ba_Object_id值 - 我假設它們是int,因爲我不知道,並且根據它們排序對象列表,但是默認情況下不會使底層對象相等。它們可能是等價的,但如果它們在內存中不是同一個對象,並且正在使用默認的引用相等性,它們將不會「相同」 - 這就是您可能想要定義自己的運算符==來比較它們的位置。 – itsmatt

0

您或許可以用override Equals() or ==以任何方式比較對象(即具有相同的ID屬性)。

這種方式可以控制何時應該將兩個對象視爲相等。

0

我懷疑它們是相同的物體。否則object.equals()將返回true。

Equals的默認實現支持引用類型爲 的引用相等,並且值類型按位相等。參考 相等意味着被比較的對象引用指的是同一對象的 。按位相等意味着被比較的對象具有相同的二進制表示。

請注意,派生類型可能會覆蓋等於方法以實現 值相等。值相等意味着比較對象具有相同的值,即使它們具有不同的二進制表示。對於 示例,請考慮代表數字1.10 和1.1000的兩個Decimal對象。 Decimal對象不具有按位相等性,因爲它們具有不同的二進制表示形式來說明不同數量的尾隨零。但是,對象的值爲 ,因爲數字1.10和1.1000被認爲等於 的比較目的,因爲後面的零不重要。

爲了達到你所解釋我們,你最好留下重寫Equals方法,也儘量使用==和!=運算我們需要重載那些。