2014-09-18 42 views

回答

4

假設 - C#平等成員 - 前。等於(...)方法。 c#平等比較器 - 例如IEqualityComparer接口。

簡而言之,在Equality Compare的幫助下,您可以提高代碼的可用性。

例如,您正在構建一個車輛目錄,並且您要確保密鑰(型號和代碼不同)。現在這個邏輯適用於任何類型的車輛。因此,定義一個默認比較器並將它用於任何地方都是一個好主意。

這是給你參考的例子:

using System; 
using System.Collections.Generic; 
using ConsoleApplication3; 

public class Program 
{ 
    internal class Car : IVehicle 
    { 
     public List<string> Features { get; set; } 
     public string ModelNumber { get; set; } 
     public string ModelCode { get; set; } 
    } 

    internal class Bike : IVehicle 
    { 
     public string ModelNumber { get; set; } 
     public List<string> Features { get; set; } 
     public string ModelCode { get; set; } 
    } 

    public static void Main() 
    { 
     var carCatelogue = new Dictionary<Car, int>(new GlobalEqualityComparer()); 
     var bikeCatelogue = new Dictionary<Bike, int>(new GlobalEqualityComparer()); 

     carCatelogue.Add(new Car() 
     { 
      ModelCode = "100", 
      ModelNumber = "CAR-01", 
      Features = new List<string> { "BEST ENGINE", "5 GEAR", "SPOTY" } 
     }, 5); 

     carCatelogue.Add(new Car() 
     { 
      ModelCode = "100", 
      ModelNumber = "CAR-02", 
      Features = new List<string> { "SUPER FAST ENGINE", "4 GEAR", "SPOTY RED" } 
     }, 10); 

     // This Statement will throw exception because car-02 key already exists. 
     carCatelogue.Add(new Car() 
     { 
      ModelCode = "100", 
      ModelNumber = "CAR-02", 
      Features = new List<string> { "SUPER FAST ENGINE", "4 GEAR", "SPOTY RED" } 
     }, 10); 

     bikeCatelogue.Add(new Bike() 
     { 
      ModelCode = "200", 
      ModelNumber = "BIK-01", 
      Features = new List<string> { "800 CC", "10 GEAR", "SPOTY BLACK" } 
     }, 5); 


     // this will throw exception because the key is aleady exists. 
     bikeCatelogue.Add(new Bike() 
     { 
      ModelCode = "200", 
      ModelNumber = "BIK-01", 
      Features = new List<string> { "800 CC", "10 GEAR", "SPOTY BLACK" } 
     }, 5); 
    } 

    private class GlobalEqualityComparer : IEqualityComparer<IVehicle> 
    { 
     public bool Equals(IVehicle x, IVehicle y) 
     { 
      return x.ModelNumber.Equals(y.ModelNumber, StringComparison.CurrentCultureIgnoreCase) 
      && x.ModelCode.Equals(y.ModelCode, StringComparison.CurrentCultureIgnoreCase); 
     } 

     public int GetHashCode(IVehicle obj) 
     { 
      return string.Format("{0}{1}", obj.ModelCode, obj.ModelNumber).GetHashCode(); 
     } 
    } 
} 

在使用會員的情況下,如等於,你將不得不寫轎車相同的邏輯,以及自行車。

現在,當你想使用的地方,它會完全歸結於你。

如果您對基礎平等感到滿意,即將參考值與參考值進行比較,然後您可以使用它,而無需重寫。

如果你是特定於任何問題,你需要給我一個例子。

希望它有幫助。

1

依託ReSharper的幫助,平等成員將創建與X類的對象比較X類的其他對象的方法,並object類型的對象。基本上,比較一切。
當與一個對象進行比較時,您會檢查它是否爲空,並且它是一個X對象,如果其中一個失敗,則返回false,然後確保它們相等,具體取決於您決定的類的哪些屬性比較。

相等比較器創建一個類(一個對象),將負責比較類型爲X的兩個對象。

例如,有串s1s2,平等的成員,你可以這樣做:s1.Equals(s2)s1.Equals(some_other_object),並與比較器,你可以這樣做:String.Equals(s1,s2)

相同,但不同。

相關問題