2015-09-03 10 views
13

habe ich folgendes für eine Position Klasse:Int32.ToString() zu langsam

public struct Pos 
{ 
    public int x; 
    public int y; 
    public float height; 

    public Pos (int _x, int _y, float _height) 
    { 
     x = _x; 
     y = _y; 
     height = _height; 
    } 

    public override string ToString() 
    { 
     return x.ToString() + "," + y.ToString(); 
    } 
} 

Aber da ich Pos.ToString() tausende Male nenne, das ist mir zu langsam. Alles, was ich brauche, ist ein effizienter Weg, um einen einzigen eindeutigen Wert basierend auf Pos.x und Pos.y zu erhalten, für die Verwendung als Wörterbuchschlüssel. Hinweis: Ich kann Pos nicht verwenden, da ich unterschiedliche Instanzen von Pos nur auf x und y vergleiche.

+9

Verwenden Sie 'ToString' nicht für Wörterbuchschlüssel. Implementieren Sie 'IEquatable ' stattdessen. –

+5

Keine Notwendigkeit für 'ToString()' in der Verkettung. Verwenden Sie einfach 'x +", "+ y' –

+0

string.Format (" {0}, {1} ", x, y) sollte es etwas besser machen – Yahya

Antwort

29

Alles was ich brauche ist ein effizienter Weg, um einen einzigen eindeutigen Wert basierend auf Pos.x und pos.y zu bekommen, für die Verwendung als Wörterbuch-Taste.

Sie ToString als eine Möglichkeit, nicht eindeutig zuzuordnen Dictionary-Schlüssel verwenden, um zu generieren, implementieren IEquatable<Pos> statt. Auf diese Weise müssen Sie keine Strings überhaupt Gleichheit messen zuteilen:

public struct Pos : IEquatable<Pos> 
{ 
    public int X { get; private set; } 
    public int Y { get; private set; } 
    public float Height { get; private set; } 

    public Pos(int x, int y, float height) 
    { 
     X = x; 
     Y = y; 
     Height = height; 
    } 

    public bool Equals(Pos other) 
    { 
     return X == other.X && Y == other.Y; 
    } 

    public override bool Equals(object obj) 
    { 
     if (ReferenceEquals(null, obj)) return false; 
     return obj is Pos && Equals((Pos) obj); 
    } 

    public override int GetHashCode() 
    { 
     unchecked 
     { 
      return (X*397)^Y; 
     } 
    } 

    public static bool operator ==(Pos left, Pos right) 
    { 
     return left.Equals(right); 
    } 

    public static bool operator !=(Pos left, Pos right) 
    { 
     return !left.Equals(right); 
    } 
} 

Hinweis Sie die private set aus den Eigenschaften Erklärungen entfernen können, wenn Sie C# verwenden -6.

+2

Eine kleine Verbesserung: In C# 6 können Sie das 'private Set' vom X entfernen und Y Eigenschaften. –

+1

Ich weiß, aber nicht jeder benutzt C# 6, also ging ich mit der längsten Version. –

+4

Warum 'X * 397'? Ist es eine magische Konstante oder eine Zufallszahl? – vojta

Verwandte Themen