我正在开发一个创建对象(卡片)的程序(学习C#),并且在程序中按值对卡片组进行排序。我感到困惑的是,当对象的实例不是传递给方法的参数而是类对象时,它如何能够通过卡的值对一副牌进行排序。下面是帮助回答我的问题的代码 - 如果我传递实例化的对象,我会完成这个。
创建对象的类:
class Card
{
public Suits Suit { get; set; }
public Values Value { get; set; }
public Card(Suits suit, Values value)
{
this.Suit = suit;
this.Value = value;
}
public string Name
{
get { return Value.ToString() + " of " + Suit.ToString(); }
}
public override string ToString()
{
return Name;
}
}
在另一个类中,我调用的方法是实例化从接口IComparer继承的对象(CardComparer_byValue)。这就是我的困惑所在。
public void SortByValue() {
cards.Sort(new CardComparer_byValue());
}
SortByValue类
class CardComparer_byValue : IComparer<Card>
{
public int Compare(Card x, Card y)
{
if (x.Value > y.Value)
return 1;
if (x.Value < y.Value)
return -1;
if (x.Suit > y.Suit)
return 1;
if (x.Suit < y.Suit)
return -1;
return 0;
}
}
我认为上面的方法“SortByValue”就像这样调用
Card mycard = new Card("Spades", 4);
public void SortByValue() {
cards.Sort(new CardComparer_byValue(mycard));
}
那么有人会向我解释我对这种排序如何以这种方式工作的缺失吗?
答案 0 :(得分:5)
它正在整理整个集合,而不是针对特定的“卡片”。
这就是Compare
方法被定义为:
public int Compare(Card x, Card y)
它使用“Card x”和“Card y”,在cards
集合中的元素对上调用它,以便对其进行排序。 Sort
方法多次调用此Compare
方法 ,使用它通过一次比较成对的元素对整个集合进行排序。
答案 1 :(得分:1)
实现IComparer<T>
的类需要有一个方法Compare(T x, T y)
,Sort
在排序操作期间重复调用。
由于List<T>
位于List<T>
,因此您有多张卡正在处理。 {{1}}使用Sort方法,该方法使用QuickSort算法对它们进行排序。
答案 2 :(得分:0)
new CardComparer_byValue(mycard));
这里你没有调用方法 - 你正在尝试构造一个对象。该类没有定义一个带有Card对象的构造函数,因此编译时会出现一个syntrax错误。
这里要注意的重要一点是IComparer对象只是一个对象。这就像一个判断订单的小法官。 (“我希望你重新订购我的卡片,这是伯恩斯坦先生告诉你他们的顺序。”)
因此,在Sort方法的某个深处,有一行如:
if (cmp.Compare(lhsCard, rhsCard) > 0)
/* swap lhsCard & rhsCard */