2014-09-18 48 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)

相同,但不同。

相关问题