唉,现在不可能实现一个简单的<=>运算符并拥有所有>, <, ==等运算符以及IComparable<Node>,IEquatable<Node>......我们必须编写大量的样板代码。
我建议实施
public static int Compare(Node left, Node right)
比较两个Node实例的方法,然后您可以轻松设计所有其余的 oneliner:
private class Node : IComparable<Node>, IEquatable<Node> {
private T data;
private int key;
public static int Compare(Node left, Node right) {
if (ReferenceEquals(left, right)) // we can't use == here
return 0;
if (left is null) // or ReferenceEquals(left, null) to avoid ==
return -1;
if (right is null)
return 1;
//TODO: return compare result
// negative if left < right,
// 0 if left == right
// positive if left > right
return left.key.CompareTo(right.key);
}
//TODO: Check: I've assumed that comparison is key based
public override int GetHashCode() => key;
// A lot of boiler plate code below...
public int CompareTo(Node other) => Compare(this, other);
public bool Equals(Node other) => Compare(this, other) == 0;
public override bool Equals(object obj) => obj is Node node && Equals(node);
public static bool operator ==(Node left, Node right) => Compare(left, right) == 0;
public static bool operator !=(Node left, Node right) => Compare(left, right) != 0;
public static bool operator >=(Node left, Node right) => Compare(left, right) >= 0;
public static bool operator > (Node left, Node right) => Compare(left, right) > 0;
public static bool operator < (Node left, Node right) => Compare(left, right) < 0;
public static bool operator <=(Node left, Node right) => Compare(left, right) <= 0;
}