2015-09-03 8 views
13

मेरे पास है एक स्थिति वर्ग के लिए निम्नलिखित:Int32.ToString() बहुत धीमी गति से

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(); 
    } 
} 

लेकिन बाद से मैं कई बार Pos.ToString() हजारों बोल रहा हूँ, यह मेरे लिए बहुत धीमी है। एक शब्दकोश कुंजी के रूप में उपयोग के लिए, मुझे केवल Pos.x और Pos.y पर आधारित एक अद्वितीय मूल्य प्राप्त करने का एक प्रभावी तरीका है। नोट: मैं Pos का उपयोग नहीं कर सकता क्योंकि मैं Pos के x और y पर विभिन्न उदाहरणों की तुलना कर रहा हूं।

+9

शब्दकोश कुंजी के लिए 'ToString' का उपयोग न करें। इसके बजाय 'IEquatable 'लागू करें। –

+5

concatenation में 'ToString()' की कोई आवश्यकता नहीं है। बस 'x + "," + y' –

+0

स्ट्रिंग का उपयोग करें। फोर्मेट ("{0}, {1}", x, y) इसे थोड़ा बेहतर बनाना चाहिए – Yahya

उत्तर

29

मुझे एक शब्दकोश कुंजी के रूप में उपयोग के लिए Pos.x और Pos.y पर आधारित एक अद्वितीय मूल्य प्राप्त करने का एक प्रभावी तरीका है।

एक तरीके के रूप ToString उपयोग करते हैं, अद्वितीय कुंजी शब्दकोश उत्पन्न बजाय IEquatable<Pos> लागू करने के लिए न करें। इस तरह, आप सब पर किसी भी तार आवंटित करने के लिए समानता को मापने के लिए की जरूरत नहीं है:

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); 
    } 
} 

नोट क्या आप सी # उपयोग कर रहे हैं गुण घोषणाओं से private set निकाल सकते हैं -6।

+2

एक छोटा सुधार: सी # 6 में आप एक्स से 'निजी सेट' को हटा सकते हैं और वाई गुण। –

+1

मुझे पता है, लेकिन हर कोई सी # 6 का उपयोग नहीं कर रहा है, इसलिए मैं लांघ संस्करण के साथ गया। –

+4

क्यों 'एक्स * 3 9 7'? क्या यह एक जादू निरंतर है, या एक यादृच्छिक संख्या है? – vojta

संबंधित मुद्दे