需要帮助了解List <t> .Sort(IComparer(T))如何知道要排序的值</t>

时间:2010-07-28 20:13:17

标签: c# .net sorting

我正在开发一个创建对象(卡片)的程序(学习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));
} 

那么有人会向我解释我对这种排序如何以这种方式工作的缺失吗?

3 个答案:

答案 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 */