Aal*_*wlx 5 c# linq dictionary visual-studio-2013
请解释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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果使用 equals 等成员,则必须为 Car 和 Bike 编写相同的逻辑。
现在,当您想在哪里使用时,这完全取决于您。
如果您对基本 Equal 感到满意,即比较引用与引用与值与值,那么您可以继续使用它,不需要覆盖。
如果你具体有任何问题,你需要给我举个例子。
希望能帮助到你。