自定义类的IComparer类

时间:2014-11-19 11:24:57

标签: c# comparison

我在列表中有一堆卡片,我想按升序或降序对它们进行排序:

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上。我做错了什么?

2 个答案:

答案 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;
    });