C# IComparer比较枚举的值

C# IComparer比较枚举的值,c#,enums,icomparable,icomparer,C#,Enums,Icomparable,Icomparer,我正在为游戏Manille实现一种比较方法(IComparer),我需要将某些卡片(枚举值)相互比较 我想以某种方式订购,这样10号牌是最大的牌,a牌是第二大牌 还有一种符号总是比其他牌(例如红心牌)更高 问题: 我不知道该怎么说。田比B,D,H大 同样,王牌必须是第二高的牌,但算法将他放在第一位 public class ManilleComparer : IComparer<Kaart> { private Kleur symbol; // the symbol

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

我想以某种方式订购,这样10号牌是最大的牌,a牌是第二大牌

还有一种符号总是比其他牌(例如红心牌)更高

问题:

我不知道该怎么说。田比B,D,H大

同样,王牌必须是第二高的牌,但算法将他放在第一位

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 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; 
                    }
                }
公共类ManilleComparer:IComparer
{
公共ManilleComparer(){}
公共ManilleComparier(列表PrefKleurRank)
{
KleurRank=预KleurRank;
}
公共马尼拉比较器(Kleur LastColor)
{
KleurRank.Remove(LastColor);
KleurRank.Add(LastColor);
}
private List KleurRank=new List(){Kleur.Ruiten,Kleur.Klaveren,Kleur.Schoppen,Kleur.Harten};
私有列表NummerRank=new List(){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};
公共整数比较(Kaart x,Kaart y)
{
int compareTo=KleurRank.IndexOf(x.Kleur).compareTo(KleurRank.IndexOf(y.Kleur));//检查符号之间的对应关系
if(compareTo==0)//如果值为0,则它们具有相同的符号
{
compareTo=NummerRank.IndexOf(x.numer).compareTo(NummerRank.IndexOf(y.numer));
}
返回比较;
}
}
您还可以将订单传递给承包商,使其更加灵活

以下是如何使用它:

                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);
Kaart k1=newkaart(){Kleur=Kleur.Ruiten,numer=numer.Drie};
Kaart k2=newkaart(){Kleur=Kleur.Harten,numer=numer.Heer};
Kaart k3=newkaart(){Kleur=Kleur.Ruiten,numer=numer.Aas};
Kaart.ManilleComparer m=新的Kaart.ManilleComparer();
List mylist=新列表();
mylist.Add(k1);
mylist.Add(k2);
mylist.Add(k3);
mylist.Sort(m);
private List MyKleurRank=new List(){Kleur.Ruiten,Kleur.Klaveren,Kleur.Harten,Kleur.Schoppen};
Kaart.ManilleComarer m2=新的Kaart.ManilleComarer(MyKleurRank);
mylist.Sort(m2);

问题是?抱歉,更新了我的postWell,为枚举成员提供强制卡值层次结构的值。你知道你能做到的,对吗
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通过只创建两张卡(不工作的卡)来测试代码,并调试代码。看看哪里的逻辑是错误的,并修复它。嗨,谢谢你的答复,我很感激!然而,我不明白NummerRank和KleurRank是什么?这是您想要的卡片和颜色的首选顺序。看看它们的顺序,与你想要的排序方式相比,它们是相等的。我用它来获得我比较的卡片的索引。它返回KleurRank和NummerRank在当前上下文中不存在。你知道我如何操作这个代码吗,所以当我调用class->manilleDek.Sort(new manillecomper(Kleur.Schoppen));这会让克莱尔·肖本(Kleur.Schoppen)坐在炉底而不是炉子上?那么你最好把克莱尔·肖本(Kleur.Schoppen)放在建筑中,我把它加到我的回答中。