C# 自定义类的IComparer类

C# 自定义类的IComparer类,c#,comparison,C#,Comparison,列表中有一堆卡片,我想按升序或降序排列: private List<Card> cards = new List<Card>(); 但是编译器已经在这里抱怨说,它在当前上下文中找不到IComparer。如果从定义中删除,则类将编译。但是,为了能够对上面的卡进行排序,类似这样的操作:this.cards.sort(new CardCompDesc())看起来我必须使用IComparer而不是IComparer。我做错了什么?我刚刚拿了一个比较,我用它来比较。。这里是它的要

列表中有一堆卡片,我想按升序或降序排列:

private List<Card> cards = new List<Card>();

但是编译器已经在这里抱怨说,它在当前上下文中找不到IComparer。如果从定义中删除
,则类将编译。但是,为了能够对上面的卡进行排序,类似这样的操作:
this.cards.sort(new CardCompDesc())看起来我必须使用IComparer而不是IComparer。我做错了什么?

我刚刚拿了一个比较,我用它来比较。。这里是它的要点

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;
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
名称空间MyNameSpace
{
公共类MyComparer:IComparer
{
公共整数比较(整数x,整数y)
{
//x更大,向上移动它
如果(x>y)
{
返回1;
}
//x比y小,向上移动y
if(x
您混淆了这两种不同的类型和类型。请注意,它们位于不同的名称空间中,第一个名称空间有一个类型参数(称为“
IComparer`1[T]
by.NET”),而第二个名称空间是非泛型的

不需要使用非泛型类型

我们也要这样做:

public class CardCompDesc : IComparer<Card> {
    int IComparer<Card>.Compare(Card a, Card b) {
        // return 0, -1, or -1 later
        return 0;
    }
}
实际上,最好指定基类
比较器
(no
I
):

如果要从箭头创建
比较器
实例,它是:

var yourComparer = Comparer<Card>.Create((a, b) => {
        // return 0, -1, or -1 later
        return 0;
    });
var-yourcomarer=Comparer.Create((a,b)=>{
//稍后返回0、-1或-1
返回0;
});

位于
System.Collections.Generic
命名空间中。您确定已经导入了吗?另外,Compare方法的签名不正确。它应该是
int Compare(Card a,Card b)
,而不是一个显式的接口实现。您还可以使用Linq OrderBy扩展方法对列表升序cards=cards.OrderBy(c=>c.Name).ToList()进行排序;descendingCards=cards.OrderByDescending(c=>c.Name.ToList();J.Steen:谢谢,这是我的第一个错误。@J.Steen谢谢你指出这是一个离题,但是为什么你需要int的comparer?@PawełReszka你不需要,但是我在这里的东西在这种情况下没有意义。我可以选择任何类型来使用,我只是认为
int
是描述它如何工作的最简单的方式。谢谢,我让它工作了,我使用了错误的“使用”,并且根据上面的注释,比较方法的签名也有一些错误。顺便说一句,Linq真的不需要,对吗?@Jonny很好,伙计。不需要。就像我说的,这只是我已经写过的一节课上的剪贴画。几乎只需要
System.Collections.Generic
public class CardCompDesc : IComparer<Card> {
    public int Compare(Card a, Card b) {
        // return 0, -1, or -1 later
        return 0;
    }
}
public class CardCompDesc : Comparer<Card> {
    public override int Compare(Card a, Card b) {
        // return 0, -1, or -1 later
        return 0;
    }
}
this.cards.Sort((a, b) => {
        // return 0, -1, or -1 later
        return 0;
    });
var yourComparer = Comparer<Card>.Create((a, b) => {
        // return 0, -1, or -1 later
        return 0;
    });