【问题标题】:IComparer compare value of enumIComparer 比较枚举的值
【发布时间】:2018-11-11 13:23:04
【问题描述】:

我正在为 Manille 游戏实现比较方法 (IComparer),我需要相互比较某些卡片(枚举值)。

我想以某种方式排列它们,以便 10 号是最大的牌,而 Ace 是第二大的牌。

还有一个特定的符号总是高于其他牌(例如红心)

问题:

我不知道如何判断 Nummer.Tien 比 B、D、H 大

Ace 也必须是第二高的牌,但算法将他放在第一位。

public class ManilleComparer : IComparer<Kaart>
{
        private Kleur symbol; // the symbol that is higher

        public ManilleComparer(Kleur symbol)
        {
            this.symbol = symbol;
        }

        public int Compare(Kaart x, Kaart y)
        {
            int compareTo = x.Kleur.CompareTo(y.Kleur); //check symbols against each other

            if (compareTo == 0) // if value is 0 they have the same symbol
            {
                compareTo = x.Nummer.CompareTo(y.Nummer); // order them 
                return compareTo;
            }

            return x.Nummer.CompareTo(y.Nummer); // else compare values
        }
}

public enum Nummer { Aas, Twee, Drie, Vier, Vijf, Zes, Zeven, Acht, Negen, Tien, Boer, Dame, Heer } // Ace, Two, Three, Four, Five, Six, Zeven, Eight, Nine, Ten, 11, 12, 13

public enum Kleur { Schoppen, Harten, Klaveren, Ruiten }

我有一个排序方法,可以按照正确的顺序对所有卡片进行排序,这些单词很好:

public int CompareTo(object obj)
        {
            Kaart dezeKaart = this;
            Kaart andereKaart = obj as Kaart;
            int compareTo = dezeKaart.Kleur.CompareTo(andereKaart.Kleur);
            if(compareTo == 0)
            {
                compareTo = dezeKaart.Nummer.CompareTo(andereKaart.Nummer);
                return compareTo;
            }
            return compareTo;
        }

这种排序方法的结果是:

   // ♠A -  ♠2 -  ♠3 -  ♠4 -  ♠5 -  ♠6 -  ♠7 -  ♠8 -  ♠9 - ♠10 -  ♠B -  ♠D -  ♠H
    // ♥A -  ♥2 -  ♥3 -  ♥4 -  ♥5 -  ♥6 -  ♥7 -  ♥8 -  ♥9 - ♥10 -  ♥B -  ♥D -  ♥H
    // ♣A -  ♣2 -  ♣3 -  ♣4 -  ♣5 -  ♣6 -  ♣7 -  ♣8 -  ♣9 - ♣10 -  ♣B -  ♣D -  ♣H
    // ♦A -  ♦2 -  ♦3 -  ♦4 -  ♦5 -  ♦6 -  ♦7 -  ♦8 -  ♦9 - ♦10 -  ♦B -  ♦D -  ♦H

I now want to implement Icompare
to have this as an outcome:

    // ♦7 -  ♦8 -  ♦9 -  ♦B -  ♦D -  ♦H -  ♦A - ♦10
    // ♣7 -  ♣8 -  ♣9 -  ♣B -  ♣D -  ♣H -  ♣A - ♣10
    // ♠7 -  ♠8 -  ♠9 -  ♠B -  ♠D -  ♠H -  ♠A - ♠10
    // ♥7 -  ♥8 -  ♥9 -  ♥B -  ♥D -  ♥H -  ♥A - ♥10

【问题讨论】:

  • 问题出在哪里?
  • 抱歉,更新了我的帖子
  • 好吧,给你的枚举成员值以强制卡值层次结构。你知道你能做到,对吧? enum MyEnum { One = 1, Three = 3, //etc. }
  • 我知道,但这会弄乱我的其他排序方法,结果必须是: // ♠A - ♠2 - ♠3 - ♠4 - ♠5 - ♠6 - ♠7 - ♠ 8 - ♠9 - ♠10 - ♠B - ♠D - ♠H // ♥A - ♥2 - ♥3 - ♥4 - ♥5 - ♥6 - ♥7 - ♥8 - ♥9 - ♥10 - ♥B - ♥D - ♥H ... 这种排序方法必须是: // ♦7 - ♦8 - ♦9 - ♦B - ♦D - ♦H - ♦A - ♦10 // ♣7 - ♣8 - ♣ 9 - ♣B - ♣D - ♣H - ♣A - ♣10 // ♠7 - ♠8 - ♠9 - ♠B - ♠D - ♠H - ♠A - ♠10 // ♥7 - ♥8 - ♥ 9 - ♥B - ♥D - ♥H - ♥A - ♥10
  • 只创建两张卡(那些不起作用的卡)来测试您的代码并调试您的代码。看看逻辑错在哪里,改正。

标签: c# enums icomparable icomparer


【解决方案1】:

您可以执行以下操作:

    public class ManilleComparer : IComparer<Kaart>
                {
                    public ManilleComparer(){}

                    public ManilleComparer(List<Kleur> PrefKleurRank)
                    {
                        KleurRank = PrefKleurRank;
                    }

                    public ManilleComparer(Kleur LastColor)
                    {
                        KleurRank.Remove(LastColor);
                        KleurRank.Add(LastColor);
                    }

                    private List<Kleur> KleurRank = new List<Kleur>() { Kleur.Ruiten , Kleur.Klaveren, Kleur.Schoppen, Kleur.Harten };
                    private List<Nummer> NummerRank = new List<Nummer>() { Nummer.Twee, Nummer.Drie, Nummer.Vier, Nummer.Vier, Nummer.Zes, Nummer.Zeven,  Nummer.Acht, Nummer.Negen, Nummer.Boer, Nummer.Dame, Nummer.Heer, Nummer.Aas, Nummer.Tien };

                    public int Compare(Kaart x, Kaart y)
                    {
                        int compareTo = KleurRank.IndexOf(x.Kleur).CompareTo(KleurRank.IndexOf(y.Kleur)); //check symbols against each other

                        if (compareTo == 0) // if value is 0 they have the same symbol
                        {
                            compareTo = NummerRank.IndexOf(x.Nummer).CompareTo(NummerRank.IndexOf(y.Nummer));  
                        }

                        return compareTo; 
                    }
                }

您也可以将订单传递给承包商以更加灵活

这是如何使用它:

                Kaart k1 = new Kaart() { Kleur = Kleur.Ruiten, Nummer = Nummer.Drie };
                Kaart k2 = new Kaart() { Kleur = Kleur.Harten, Nummer = Nummer.Heer };
                Kaart k3 = new Kaart() { Kleur = Kleur.Ruiten, Nummer = Nummer.Aas };

                Kaart.ManilleComparer m = new Kaart.ManilleComparer();

                List<Kaart> mylist = new List<Kaart>();
                mylist.Add(k1);
                mylist.Add(k2);
                mylist.Add(k3);

                mylist.Sort(m);

                private List<Kleur> MyKleurRank = new List<Kleur>() { Kleur.Ruiten , Kleur.Klaveren, Kleur.Harten , Kleur.Schoppen};

                Kaart.ManilleComparer m2 = new Kaart.ManilleComparer(MyKleurRank);

                mylist.Sort(m2);

【讨论】:

  • 您好,感谢您的回复,非常感谢!但是我对 NummerRank 和 KleurRank 是什么感到困惑?
  • 这是您想要的卡片和颜色的首选订单。查看它们的顺序与您希望它们的排序方式相比,它是相等的。我正在使用它来获取我比较的卡片的索引。
  • 返回 KleurRank 和 NummerRank 在当前上下文中不存在
  • 你知道我如何操作这段代码,所以当我调用类时 -> manilleDek.Sort(new ManilleComparer(Kleur.Schoppen));它会将 Kleur.Schoppen 而不是 Hearths 放在底部?
  • 那么你最好在构造函数中传递 KleurRank,我将它添加到我的答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 2023-03-09
  • 2023-03-17
相关资源
最近更新 更多