请解释C#平等成员和相等比较器之间的区别,以及如何选择哪一个,以及在什么情况下使用它们?
我特别感兴趣的是LINQ操作或.NET操作或类型中比较中构建的其他语言所需的语言 - 例如,词典键。
谢谢。
答案 0 :(得分:4)
假设 - C#平等成员 - 例如等于(...)方法。 c#Equality Comparer - 例如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();
}
}
}
如果使用equals等成员,你必须为Car和Bike编写相同的逻辑。
现在,当你想在哪里使用时,它将完全归结于你。
如果您对基本平等感到满意,即将参考值与参考值与价值进行比较,那么您可以保留它并且不需要覆盖。
如果您具体针对任何问题,您需要举个例子。
希望它有所帮助。
答案 1 :(得分:1)
依靠Resharper的帮助,Equality成员将创建方法,将类X
的对象与类X
的另一个对象以及类型object
的对象进行比较。基本上,与一切相比
与对象进行比较时,您将检查它是否为空,并且它是X
对象,如果失败则返回false,然后确保它们相等,具体取决于您的类的属性决定比较。
相等比较器创建一个类(一个对象),它将负责比较两个类型为X
的对象。
例如,对于具有相等成员的字符串s1
和s2
,您可以执行:s1.Equals(s2)
和s1.Equals(some_other_object)
,并使用比较器执行:{ {1}}。
同样但不同。