我在列表中有一堆卡片,我想按升序或降序对它们进行排序:
private List<Card> cards = new List<Card>();
上升/下降意味着我必须简单地比较卡片的价值。
我该怎么办? IComparable接口似乎还不够,因为它只能排序一种“默认”方式。所以我试图实现IComparer
,但失败了。在与Card相同的类文件中,我尝试按降序添加此比较类:
public class CardCompDesc : IComparer<Card> {
int IComparer.Compare(object a, object b)
// return 0, -1, or -1 later
return 0
{
}
但是已经在这里编译器抱怨它在当前上下文中找不到IComparer。如果我从定义中删除<Card>
,则该类将编译。然而,为了能够对上面的卡进行排序,这样的事情:this.cards.Sort(new CardCompDesc());
看起来我将不得不使用IComparer&lt;&gt;在IComparer上。我做错了什么?
答案 0 :(得分:1)
我只是抓住了一个我使用的比较工作..这是它的要点......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyNameSpace
{
public class MyComparer: IComparer<int>
{
public int Compare(int x, int y)
{
// x is greater move it up
if (x > y)
{
return 1;
}
// x is smaller move y up
if (x < y)
{
return -1;
}
// do nothing (equal)
return 0;
}
}
}
答案 1 :(得分:0)
您混淆了两种截然不同的类型System.Collections.Generic.IComparer<>
和System.Collections.IComparer
。请注意,它们位于不同的命名空间中,第一个具有一个类型参数(由.NET称为IComparer`1[T]
),而第二个是非泛型的。
无需使用非泛型类型。
所以:
public class CardCompDesc : IComparer<Card> {
int IComparer<Card>.Compare(Card a, Card b) {
// return 0, -1, or -1 later
return 0;
}
}
如果您坚持使用显式接口实现来执行此操作。但是,为什么不简单地通过public
方法实现,如:
public class CardCompDesc : IComparer<Card> {
public int Compare(Card a, Card b) {
// return 0, -1, or -1 later
return 0;
}
}
实际上,最好指定基类Comparer<Card>
(不是I
):
public class CardCompDesc : Comparer<Card> {
public override int Compare(Card a, Card b) {
// return 0, -1, or -1 later
return 0;
}
}
这样,您的CardCompDesc
实例将 IComaparer<Card>
和(非通用)IComparer
,您仍然只需要编写一个方法上课。
最后,如果您可以将单个方法编写为箭头=>
,那么您甚至不必编写自己的类。你可以简单地说:
this.cards.Sort((a, b) => {
// return 0, -1, or -1 later
return 0;
});
如果您希望从箭头创建Comparer<>
实例,则为:
var yourComparer = Comparer<Card>.Create((a, b) => {
// return 0, -1, or -1 later
return 0;
});