请解释C#等号成员和相等比较器之间的区别,以及如何选择哪一个是必需的,以及在什么情况下使用它们?在c#中,等式成员和等号比较器之间有什么区别,你应该使用哪一个?
我特别感兴趣的是LINQ操作或在.NET操作或类型内进行比较时构建的其他语言 - 例如,Dictionary键。
谢谢。
请解释C#等号成员和相等比较器之间的区别,以及如何选择哪一个是必需的,以及在什么情况下使用它们?在c#中,等式成员和等号比较器之间有什么区别,你应该使用哪一个?
我特别感兴趣的是LINQ操作或在.NET操作或类型内进行比较时构建的其他语言 - 例如,Dictionary键。
谢谢。
假设 - 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();
}
}
}
在使用会员的情况下,如等于,你将不得不写轿车相同的逻辑,以及自行车。
现在,当你想使用的地方,它会完全归结于你。
如果您对基础平等感到满意,即将参考值与参考值进行比较,然后您可以使用它,而无需重写。
如果你是特定于任何问题,你需要给我一个例子。
希望它有帮助。
依托ReSharper的帮助,平等成员将创建与X
类的对象比较X
类的其他对象的方法,并object
类型的对象。基本上,比较一切。
当与一个对象进行比较时,您会检查它是否为空,并且它是一个X
对象,如果其中一个失败,则返回false,然后确保它们相等,具体取决于您决定的类的哪些属性比较。
相等比较器创建一个类(一个对象),将负责比较类型为X
的两个对象。
例如,有串s1
和s2
,平等的成员,你可以这样做:s1.Equals(s2)
和s1.Equals(some_other_object)
,并与比较器,你可以这样做:String.Equals(s1,s2)
。
相同,但不同。