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

Aal*_*wlx 5 c# linq dictionary visual-studio-2013

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

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

谢谢.

cod*_*sed 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果使用 equals 等成员,则必须为 Car 和 Bike 编写相同的逻辑。

现在,当您想在哪里使用时,这完全取决于您。

如果您对基本 Equal 感到满意,即比较引用与引用与值与值,那么您可以继续使用它,不需要覆盖。

如果你具体有任何问题,你需要给我举个例子。

希望能帮助到你。