Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#] Probleem met het vergelijken van dictionaries

Pagina: 1
Acties:

  • Kayshin
  • Registratie: Juni 2004
  • Laatst online: 09-03-2018

Kayshin

Bl@@T @@P!!!

Topicstarter
Ik ben aan het proberen om de containskey methode te gebruiken van een dictionary:
Dictionary<Trigger, State>

Zoals je ziet is mijn trigger een custom class die ik gemaakt heb. Om custom classes te kunnen vergelijken moet ik blijkbaar mijn gethashcode overriden, wat ik ook gedaan heb, echter maak ik volgens mij ergens een denkfout in mijn implementatie waardoor het niet werkt. Ik zit hier al een tijdje mee te spelen maar ik krijg het dus niet voor elkaar om het werkend te krijgen.
C#:
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
51
52
53
public class Parameter : IEquatable<Parameter>
{
    public string Field { get; set; }
    public string Content { get; set; }

    public bool Equals(Parameter other)
    {
        if (other == null)
        {
            return false;
        }

        return Field.Equals(other.Field) && Content.Equals(other.Content);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            int hash = 17;
            hash = hash * 23 + Field.GetHashCode();
            hash = hash * 23 + Content.GetHashCode();
            return hash;
        }
    }
}

public class Trigger : IEquatable<Trigger>
{
    public Dictionary<int, Parameter> Parameters { get; private set; }
    private string Event { get; set; }

    public bool Equals(Trigger item)
    {
        if (item == null)
        {
            return false;
        }

        return Event.Equals(item.Event) && Parameters.Equals(item.Parameters);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            var hash = 17;
            hash = hash * 23 + Parameters.GetHashCode();
            hash = hash * 23 + Event.GetHashCode();
            return hash;
        }
    }
}


Wat mijn denkwijze was is dat ik van alle velden die in mijn klasse staan zorg dat er een goede gethashcode en equals methode wordt gemaakt, zodat deze zich tegenover elkaar kunnen checken en dat ik dit zelfde doe op een hoger niveau, gebruikmakend van de gethashcode van deze lagere velden, echter werkt dit niet zoals ik had bedacht.

My personal videoteek: -Clique-; -NMe- is een snol!


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Je override equals niet, en verder voldoet je equals nog niet aan MSDN: Guidelines for Overriding Equals() and Operator == (C# Programming Guide) (cast ontbreekt en NullReferenceException mogelijk).

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • Kayshin
  • Registratie: Juni 2004
  • Laatst online: 09-03-2018

Kayshin

Bl@@T @@P!!!

Topicstarter
Ik heb het opgelost:
Ik heb een static class (die iemand een keertje heeft gemaakt) gebruikt om Dictionaries op equality te kunnen vergelijken en deze gebruik ik nu in mijn equals:
C#:
1
2
3
4
5
6
7
8
9
public override bool Equals(object obj)
{
    var item = obj as Trigger;
    if (item == null)
    {
        return false;
    }
    return Event.Equals(item.Event) && Dictionaries.Equals(Parameters, item.Parameters);
}


Dictionaries is de static class die dus dictionaries van whatever type kan vergelijken. Dit doet hij door de hashcodes van alle entries te berekenen en hierop te vergelijken:
https://code.google.com/p...llections/Dictionaries.cs

My personal videoteek: -Clique-; -NMe- is een snol!


  • HMS
  • Registratie: Januari 2004
  • Laatst online: 17-11 00:33

HMS

Dat is niet de correcte manier om gelijkheid te bepalen. De afspraak voor Equals en GetHashCode is:
  • Als x.Equals(y), dan x.GetHashCode() == y.GetHashCode().
  • Als x.GetHashCode() == y.GetHashCode(), dan hoeft niet x.Equals(y).
Zie ook:
http://stackoverflow.com/...uals-method-is-overridden

edit:

Ik reageer op dit stukje:
Dit doet hij door de hashcodes van alle entries te berekenen en hierop te vergelijken:

[ Voor 16% gewijzigd door HMS op 16-04-2013 13:55 ]


  • Corniel
  • Registratie: April 2002
  • Laatst online: 31-03 14:56

Corniel

De wereld is gek!

Beetje late reactie misschien maar ik zag het topic nu pas. Volgens mij kan je het beste zo iets doen:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var dict = new Dictionary<Trigger, State>(new TriggerComparer());

public class TriggerComparer : IEqualityComparer<Trigger>
{
    public bool Equals(Trigger x, Trigger y)
    {
        // null hoeft niet gecheckt te worden, is geen valide key.
        return x.Event.Equals(y.Event) &&
            // dwing af dat parameters altijd gezet zijn, anders krakt dit.
            x.Parameters.Keys.Count == y.Parameters.Keys.Count &&
            x.Parameters.All(kpv => y.Parameters[kpv.Key].Equals(x.Parameters[kpv.Key]));
    }

    public int GetHashCode(Trigger obj)
    {
        // snelle poging. Equals doet de rest.
        return obj.GetHashCode() ^ obj.Parameters.Keys.Count;
    }
}

while (me.Alive) {
me.KickAss();
}