C# 泛型和IComparable-错误CS00301
我试图开发一个实现IComparable的泛型类“MinHeap(T)”。当泛型为“int”或另一个类为“Code”时,它可以正常工作。更进一步,为T使用泛型类“节点(代码)” 导致下面提到的错误 我可能太新了,不理解IComparable和IComparable(T)之间的细微差别。有人有主意吗? 提前感谢您的帮助, LJ 错误消息: 错误2类型“Algorithms.Node(Algorithms.Code)”不能用作泛型类型或方法“Algorithms.MinHeap(T)”中的类型参数“T”。没有从'Algorithms.Node(Algorithms.Code)'到'System.IComparable'的隐式引用转换 类C# 泛型和IComparable-错误CS00301,c#,.net,generics,icomparable,C#,.net,Generics,Icomparable,我试图开发一个实现IComparable的泛型类“MinHeap(T)”。当泛型为“int”或另一个类为“Code”时,它可以正常工作。更进一步,为T使用泛型类“节点(代码)” 导致下面提到的错误 我可能太新了,不理解IComparable和IComparable(T)之间的细微差别。有人有主意吗? 提前感谢您的帮助, LJ 错误消息: 错误2类型“Algorithms.Node(Algorithms.Code)”不能用作泛型类型或方法“Algorithms.MinHeap(T)”中的类型参数“
节点
未实现i可比较
。它只是对T
的类型有一个约束
看起来您已尝试实现该模式。同时实现接口,然后将方法映射到装饰对象。您应该在节点类中实现IComparable接口,如下所示:
public class Node<T>: IComparable<Node<T>> // <- IComparable<Node<T>> implemented
where T: IComparable {
T data;
...
#region IComparable<Node<T>> Members
// interface implementation, not just a method
public int CompareTo(Node<T> other) {
// Let us be accurate with possible nulls:
if (Object.ReferenceEquals(null, other))
return 1; // <- or -1 if you think it's right
else if (Object.ReferenceEquals(data, other.data))
return 0;
else if (Object.ReferenceEquals(null, data))
return -1; // <- or 1 if you think it's right
return data.CompareTo(other.data);
}
#endregion IComparable<Node<T>> Members
}
公共类节点:IComparable/您最好定义泛型类,这样它就不需要类型来实现IComparable
。这就是.NET泛型类的实现方式。他们将使用类型的默认比较,或者使用您传入的IComparer
。例如,SortedList
具有以下构造函数(以及其他构造函数):
SortedList();//使用TKey的默认比较器
分类列表(IComparer比较器);//使用提供的比较器
它很容易实现:
public class MinHeap<T>
{
private IComparer<T> _comparer;
public MinHeap<T>(IComparer<T> comp)
{
_comparer = comp;
}
public MinHeap<T>()
: this(Comparer<T>.Default)
{
}
}
公共类MinHeap
{
私人IComparer\u comparer;
公共小堆(IComparer comp)
{
_比较器=comp;
}
公共垃圾堆()
:此(Comparer.Default)
{
}
}
这样,您的客户端就可以使用MinHeap
来保存未实现IComparable
的类的实例
进行比较时,调用\u comparer.Compare(item1,item2)
另一方面,堆不需要特别需要节点。可以在数组中实现二进制堆。例如,请参见。T
不仅应具有可比性,节点也应具有可比性。以下操作应有效:公共类节点:i可比,其中T:i可比
。MinHeap也一样@Aphelion有这样的解释。现在可以正常工作了-没有必要对MinHeap执行同样的操作-感谢LotusMinheap不必实现IComparable。@empi谢谢!我已经修改了答案。代码按照@leppie的建议修改,多亏了allI,我想你需要先做ReferenceEquals(data,other.data)
。否则,如果other.data==null
,它将始终返回-1,即使this.data==null
。很抱歉,但ReferenceEquals(data,other.data)不能是第一个。如果另一个为空呢?在这种情况下,other.data将引发异常。
SortedList<TKey, TValue>(); // uses default comparer for TKey
SortedList<TKey, TValue>(IComparer<T> comparer); // uses supplied comparer
public class MinHeap<T>
{
private IComparer<T> _comparer;
public MinHeap<T>(IComparer<T> comp)
{
_comparer = comp;
}
public MinHeap<T>()
: this(Comparer<T>.Default)
{
}
}