Toon posts:

c# ordenen met Sort() van objecten via Comparer

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Je topicstart leeghalen nadat je geholpen bent is niet cool. Ik heb de topicstart dan ook weer in ere hersteld.


Hallo,

Ik vroeg me af of iemand ervaring heeft met c# en gebruik van Comparer om objecten te vergelijken met elkaar. het gaat om een Manille Kaartspel waar ik de Kaarten in het Dek wil ordenen in Manille volgorde dus van Tien Aas Heer enzo.... De Kaarten worden via een Klasse gemaakt en er word gebruik gemaakt van Enums om ze te creeren. Hieronder de Code die ik nu heb om dit proberen te bekomen maar waar Ik alleen in slaag om de sorteren via de volgorde hoe ze in de enums staan. Het is de bedoeling om de originele enums niet aan te passen. :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
    enum Nummer { Aas = 1, Twee, Drie, Vier, Vijf, Zes, Zeven, Acht, Negen, Tien, Boer, Dame, Heer }
    enum Kleur { Schoppen, Harten, Klaveren, Ruiten }
    class Kaart
    {
        public Kaart(Kleur kleur, Nummer nummer)
        {
            Kleur = kleur;
            Nummer = nummer;
        }
        public Kleur Kleur { get; }
        public Nummer Nummer { get; }
    }

class ManilleDek : Dek
    {
        
        protected override void VulDekOp()
        {
            foreach (Kleur k in System.Enum.GetValues(typeof(Kleur)))
            {
                foreach (Nummer n in System.Enum.GetValues(typeof(Nummer)))
                {
                    if (n == Nummer.Aas ||
                       n == Nummer.Zeven ||
                       n == Nummer.Acht ||
                       n == Nummer.Negen ||
                       n == Nummer.Tien ||
                       n == Nummer.Boer ||
                       n == Nummer.Dame ||
                       n == Nummer.Heer)
                        this.Add(new Kaart(k, n));
                }
            }
        }
    public void SorteerOpWaarde()
        {   
            ManilleKaartComparer kaartComparer = new ManilleKaartComparer();
            Sort(kaartComparer);
        }  
    }
    class ManilleKaartComparer : Comparer<Kaart> 
    {
        
        public override int Compare(Kaart x, Kaart y)
        {
           
            return y.Nummer.CompareTo(x.Nummer);  
        }
    }
}


De vet gedrukte Code is waar ik het sorteren toepas. Bestaat hier iets om code als code te tonen hier ?

Groeten cooller

[ Voor 199% gewijzigd door RobIII op 22-04-2016 16:31 ]

Beste antwoord (via Verwijderd op 22-04-2016 08:24)


  • Daos
  • Registratie: Oktober 2004
  • Niet online
Je vroeg alleen:
Hoe kan ik dat verwoorden in code dat bv Nummer.Tien hoger is dan Nummer.Aas ?
Wil je de hele Compare zo maken, dan moet je alle combi's van x en y uitschrijven.

Makkelijker is ergens in de ManilleKaartComparer een statisch array'tje zetten van type Nummer[] met daarin de nummers op volgorde. In de Compare zoek je dan de indexen voor x.Nummer en y.Nummer en die indexen vergelijk je dan. Scheelt een hoop type-werk.

Alle reacties


Acties:
  • 0 Henk 'm!

  • Xudonax
  • Registratie: November 2010
  • Laatst online: 07-10 13:38
Je kunt de code binnen [code] en [/code] tags plaatsen, dan is het beter leesbaar en blijven ook de spaties/tabs bewaard. Misschien dat ik iets mis, maar ik zie niet waar de Sort methode gedefinieerd is?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Onderaan de Code the public void SorteerOpWaarde() en de comparer eronder om de objecten te vergelijken.
dank u voor de code tag tip.

groeten

[ Voor 8% gewijzigd door Verwijderd op 21-04-2016 19:20 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 08:49

Janoz

Moderator Devschuur®

!litemod

Eigenlijk is het heel simpel. Wanneer je wilt dat kaart x voor kaart y komt, dan geef je een getal kleiner dan 0 terug. Moet de kaart erna, dan geeft je een groter getal terug. En zijn ze hetzelfde, dan geef je 0 terug.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoe kan ik dat verwoorden in code dat bv Nummer.Tien hoger is dan Nummer.Aas ? Bedoel je dan zoiets:
if (Nummer.Tien.CompareTo(Nummer.Aas) > 0) return 1;

[ Voor 33% gewijzigd door Verwijderd op 21-04-2016 22:08 ]


Acties:
  • 0 Henk 'm!

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Zoiets
C#:
1
2
3
4
5
6
7
8
if (x.Nummer == Nummer.Tien && y.Nummer == Nummer.Aas)
{
    return 1;
}
else if (x.Nummer == Nummer.Aas && y.Nummer == Nummer.Tien)
{
    return -1;
}


Je kan ook een array maken met de kaarten op de juiste volgorde en dan de indexen zoeken voor x en y en die indexen dan vergelijken. Wil je het opzoeken versnellen, dan kan je ook een Dictionary<Nummer, int> gebruiken.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb het nu zo geprobeerd :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class ManilleKaartComparer : Comparer<Kaart> 
    {
        
        public override int Compare(Kaart x, Kaart y)
        {
            if (x.Nummer == Nummer.Tien && y.Nummer == Nummer.Aas)
            {
                return 1;
            }
            else if (x.Nummer == Nummer.Aas && y.Nummer == Nummer.Tien)
            {
                return -1;
            }

            return x.Nummer.CompareTo(y.Nummer);  
        }
    }

Maar nog geeft hij de volgorde weer zoals in de enum.
Hoe kan ik de indexen aanspreken in een List of Array in de Compare constructor?

Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Je vroeg alleen:
Hoe kan ik dat verwoorden in code dat bv Nummer.Tien hoger is dan Nummer.Aas ?
Wil je de hele Compare zo maken, dan moet je alle combi's van x en y uitschrijven.

Makkelijker is ergens in de ManilleKaartComparer een statisch array'tje zetten van type Nummer[] met daarin de nummers op volgorde. In de Compare zoek je dan de indexen voor x.Nummer en y.Nummer en die indexen vergelijk je dan. Scheelt een hoop type-werk.

Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 11-10 16:49
Leuk dat de TS de OP verwijderd heeft en ook niet het fatsoen heeft gehad om een antwoord te markeren.

Edit : opgelost door een mod, bedankt.

[ Voor 17% gewijzigd door Killah_Priest op 21-04-2016 23:54 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Zeg, wil je voortaan je topicstart niet leeghalen als je geholpen bent? Er zijn meer mensen die mogelijk met zo'n vraag zitten en die middels de search of Google o.i.d. ooit op je topic zullen stuiten. Die hebben dan helemaal niets meer aan de hulp/antwoorden die je hebt gekregen omdat iedereen nu in de ruimte staat te zwetsen over een vraag die er niet meer staat. Not cool, cooller. Not cool :/

Overigens, zoals Killah_Priest in "c# ordenen met Sort() van objecten via Comparer" ook aangeeft, is 't ook wel even zo netjes om het beste antwoord als zodanig te markeren als je geholpen bent. Two strike.

[ Voor 18% gewijzigd door RobIII op 21-04-2016 23:59 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Sorry voor het misverstand dit was niet de bedoeling, ik heb waarschijnlijk iets fout gedaan die reactie was daar niet bedoeld. Bedankt voor de hulp

[ Voor 33% gewijzigd door Verwijderd op 22-04-2016 10:57 ]

Pagina: 1