我一直在尝试制作一个通用的反向优先队列,但是在EnQueue中仍然无法处理使用IComparer所带来的错误。
错误信息:Error 1 对于非静态字段、方法或属性“System.Collections.Generic.IComparer.Compare(T, T)”,需要对象引用。
错误信息:Error 1 对于非静态字段、方法或属性“System.Collections.Generic.IComparer.Compare(T, T)”,需要对象引用。
public void inQ(T dat)//adding element in place, increasing order
{
if (start == null)//that means that the RPQ is empty
{
start = new node(dat);
return;
}
if (IComparer<T>.Compare(start.data, dat) > 0)//Doesn't work
{
start = new node(dat, start);
return;
}
//Default Case
//no need for an else, actually
node q = start;
while (q.next != null && Comparer<T>.Default.Compare(q.next.data, dat) < 0)//Works Perfectly
q++;
q.next = new node(dat, q.next);
}
IComparer<T>
是一个接口,您可以编写一个类来实现它,该类必须具有您想要的任何逻辑的Compare
方法。然后,创建该类的实例并在系统需要IComparer<T>
的地方使用它。请参阅MSDN上实现IComparer<T>
的示例。 - TheraotComparer<T>.Default
不会使用您创建的自定义IComparer<T>
。Comparer<T>
不会发现自定义实现。如果要使用自定义比较器,则需要获取其实例并使用它[请参见答案中如何获取一个]。通常做法是-如果您的类需要-则添加一个接受IComparer<T>
的构造函数重载,如果没有提供回退到Comparer<T>.Default
。可以像这样_comparer = comparer ?? Comparer<T>.Default;
。 - Theraot