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;
}
}
实际上,最好指定基类比较器
(noI
):
如果要从箭头创建比较器
实例,它是:
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;
});