在c#中,平等成员和相等比较器之间有什么区别,你应该使用哪个?

时间:2014-09-18 22:35:14

标签: c# linq dictionary visual-studio-2013

请解释C#平等成员和相等比较器之间的区别,以及如何选择哪一个,以及在什么情况下使用它们?

我特别感兴趣的是LINQ操作或.NET操作或类型中比较中构建的其他语言所需的语言 - 例如,词典键。

谢谢。

2 个答案:

答案 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的对象。

例如,对于具有相等成员的字符串s1s2,您可以执行:s1.Equals(s2)s1.Equals(some_other_object),并使用比较器执行:{ {1}}。

同样但不同。