我正在为Manille游戏实现比较方法(IComparer
),我需要将某些卡(枚举值)彼此进行比较。
我想以某种方式对它们进行排序,以使10号是最大的牌而Ace是第二大的牌。
还有一个特定的符号总是比其他卡片(例如Hearts)更高
问题:
我不知道该怎么说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
答案 0 :(得分: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);