c# - 字典不使用类的比较方法
问题描述
几天前,我为我写的一个类问了一个关于 C# 中字典实现的问题。我有一本字典,其中包含 class 的键和 class 的Interval
值Line2D
。我更新的间隔实现如下所示:
public class Interval : ICloneable, IComparable, IComparable<Interval>, IComparable<double>
{
public Interval()
{
}
public Interval(Interval interval)
{
this.CopyFrom<Interval>(interval);
}
public Interval(double start, double end)
{
Start = start;
End = end;
}
// Properties
public double Start { get; set; } = double.NaN;
public double End { get; set; } = double.NaN;
public double Span => End - Start;
// Methods
public object Clone() => MemberwiseClone();
public int CompareTo(object obj)
{
if (obj is Interval iObj)
{
return CompareTo(iObj);
}
return 1;
}
public int CompareTo([AllowNull] Interval other)
{
if (Start == other.Start && End == other.End)
{
return 0;
}
else if (End <= other.Start)
{
return -1;
}
else if (other.End <= Start)
{
return 1;
}
else
{
throw new ArgumentException("Interval must not overlap with this one.", nameof(other));
}
// Old implementation
//if (Start < other.Start)
//{
// return -1;
//}
//else if (Start > other.Start)
//{
// return 1;
//}
//else
//{
// return 0;
//}
}
public int CompareTo([AllowNull] double other)
=> Contains(other) ? 0 : (other < Start ? 1 : -1);
public bool Contains(double x) => Start <= x && x <= End;
public override string ToString() => $"[{Start}, {End}]";
}
因此,如果我创建一个键是Interval
对象的字典,我认为我的CompareTo
方法将涵盖两个间隔具有相同起点和终点的情况。然而,这种情况并非如此。
var testDict = new Dictionary<Interval, int>();
var testInterval1 = new Interval(0, 1);
var testInterval2 = new Interval(testInterval1); // Should be identical
testDict[testInterval1] = 5;
var contains = testDict.ContainsKey(testInterval2); // This is false when it should be true;
testDict[testInterval2] = 10; // This shouldn't work but it does
为什么默认比较器CompareTo
在执行期间不跳到我的方法中?
解决方案
要将复杂值用作字典键,您需要专门实现GetHashCode()
和Equals()
。CompareTo
与此用例无关。
推荐阅读
- php - 如何从数组的 foreach 循环创建数组?
- sqlite - Javafx:清除 SQLite 查询的 ResultSet,这样它就不会保留以前的结果
- powershell - 在 Windows 10 Powershell 中通过 F7 使命令历史弹出窗口工作
- javascript - 如何在javascript中获取频率值?
- json - 引起:org.apache.camel.InvalidPayloadException:
- sublimetext3 - Sublime Text 3 - 包控制 - 安装 | ImportError:没有名为“package_control”的模块
- javascript - 如何在javascript中计算本月和下个月的时间?
- c# - 更新标签文本仅使用给定文本的一部分
- angular - 如何在另一个应用程序中使用在一个角度应用程序中定义的自定义 html 元素
- tensorflow - 验证和训练期间 TensorFlow 中的批量标准化