2009-05-06 42 views
4

我這裏有這樣的代碼,其目的是使任何類型的參數:如何檢查c#中的兩個值是否相等? (考慮到任何類型的值)

public static void AreEqual(object expectedValue, object actualValue) { 
    if (expectedValue == actualValue) { 
     HttpContext.Current.Response.Write("Equal"); 
    } else { 
     HttpContext.Current.Response.Write("Not Equal"); 
    } 
} 

如果我把它用幾個整數它不表現得非常好。

AreEqual(3, 3) // prints Not Equal 

回答

16

最簡單地說:

public static void AreEqual(object expectedValue, object actualValue) { 
    if (object.Equals(expectedValue,actualValue)) { 
      HttpContext.Current.Response.Write("Equal"); 
    } else { 
      HttpContext.Current.Response.Write("Not Equal"); 
    } 
} 

或者與仿製藥(支持IEquatable<T>):

public static void AreEqual<T>(T expectedValue, T actualValue) { 
    if (EqualityComparer<T>.Default.Equals(expectedValue,actualValue)) { 
      HttpContext.Current.Response.Write("Equal"); 
    } else { 
      HttpContext.Current.Response.Write("Not Equal"); 
    } 
} 
+0

+1爲通用替代品 – 2009-05-06 10:04:52

+0

那麼這是否意味着您會同時獲得10個民粹主義徽章?大聲笑 – 2009-05-06 10:05:16

+0

我沒有*任何*民粹主義徽章;-(。「其他」的答案也需要+10,我相信,所以我想你需要+22或someting! – 2009-05-06 10:14:50

2

嘗試:

if (expectedValue.Equals(actualValue)) 

,當然你需要處理null,所以你應該試試這個:

Boolean eq = false; 
if (expectedValue == null || actualValue == null) 
    eq = (expectedValue == actualValue); 
else 
    eq = expectedValue.Equals(actualValue); 

if (eq) { 
    HttpContext.Current.Response.Write("Equal"); 
} else { 
    HttpContext.Current.Response.Write("Not Equal"); 
} 

這當然是一樣@mike nelson的答案:

if (Object.Equals(expectedValue, actualValue)) 

所以要給予好評他的答案。

-3
if (expectedValue != null) 
{ 
    if (expectedValue.Equals(actualValue)) 
    { 
     // enter code here 
    } 
} 
+0

這是一個壞主意......如果expectedValue == null? – 2009-05-06 10:00:50

3

要檢查是否這兩個對象值是相等的使用這樣的:

if (Object.Equals(expectedValue, actualValue)) { 

作爲正常==運算假定有一個object是引用類型(儘管事實上值類型也從對象下降)。

4

只是爲了突出「奇怪」行爲的原因是因爲當你投一個int到對象boxing發生。這兩個3被轉換爲對象,然後你不再比較數字,你正在比較引用,這將不會是相同的。