77 Stimmen

Vergleich von zwei Strukturen mit ==

Ich versuche, zwei Strukturen in C# mit dem Operator equals (==) zu vergleichen. Meine Struktur sieht so aus:

public struct CisSettings : IEquatable
{
    public int Gain { get; private set; }
    public int Offset { get; private set; }
    public int Bright { get; private set; }
    public int Contrast { get; private set; }

    public CisSettings(int gain, int offset, int bright, int contrast) : this()
    {
        Gain = gain;
        Offset = offset;
        Bright = bright;
        Contrast = contrast;
    }

    public bool Equals(CisSettings other)
    {
        return Equals(other, this);
    }

    public override bool Equals(object obj)
    {
        if (obj == null || GetType() != obj.GetType())
        {
            return false;
        }

        var objectToCompareWith = (CisSettings) obj;

        return objectToCompareWith.Bright == Bright && objectToCompareWith.Contrast == Contrast &&
               objectToCompareWith.Gain == Gain && objectToCompareWith.Offset == Offset;

    }

    public override int GetHashCode()
    {
        var calculation = Gain + Offset + Bright + Contrast;
        return calculation.GetHashCode();
    }
}

Ich versuche, die Struktur als Eigenschaft in meiner Klasse zu haben und möchte überprüfen, ob die Struktur gleich dem Wert ist, dem ich sie zuweisen möchte, bevor ich dies tue, damit ich nicht angebe, dass sich die Eigenschaft geändert hat, wenn dies nicht der Fall ist, wie folgt:

public CisSettings TopCisSettings
{
    get { return _topCisSettings; }
    set
    {
        if (_topCisSettings == value)
        {
            return;
        }
        _topCisSettings = value;
        OnPropertyChanged("TopCisSettings");
    }
}

Auf der Zeile, wo ich die Gleichheit prüfe, erhalte ich diesen Fehler:

Operator '==' cannot be applied to operands of type 'CisSettings' and 'CisSettings'

Ich kann nicht herausfinden, warum das passiert, könnte mir jemand in die richtige Richtung weisen?

2voto

Chen Punkte 1644

Sie müssen den Operator == explizit überschreiben.

public static bool operator ==(CisSettings x, CisSettings y) 
{
   return x.Equals(y);
}

Übrigens ist es besser, den Vergleichscode in public bool Equals(CisSettings other) zu platzieren und bool Equals(object obj) bool Equals(CisSettings other) aufrufen zu lassen, damit Sie durch Vermeidung unnötiger Typüberprüfungen eine bessere Leistung erzielen können.

1voto

Xaruth Punkte 4034

Sie müssen den "==" Operator überladen, aber auch den "!=" Operator überladen. (Siehe diese Notiz)

Für die Überladung des Operators, sehen Sie diese Seite

0voto

Aqib Cybery Punkte 9

Erstellen Sie eine Methode und übergeben Sie beide Stuct-Objekte als Parameter, um sie eins nach dem anderen zu vergleichen

public Save ReturnGreater(Save online, Save local)
{
    Save DataToSave = new Save();
    DataToSave.Score = local.Score < online.Score ? online.Score : local.Score;
    DataToSave.UnlockGuns = local.UnlockGuns < online.UnlockGuns ? online.UnlockGuns : local.UnlockGuns;
    DataToSave.UnlockLevels = local.UnlockLevels < online.UnlockLevels ? online.UnlockLevels : local.UnlockLevels;
    DataToSave.TotalLevels = local.TotalLevels;
    DataToSave.RemoveAds = local.RemoveAds;
    return DataToSave;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X