2012-04-14 94 views
0

我想知道如何在c#中實現MyString類並重載運算符<<>>。 例如:自定義字符串實現超載運算符<< and >>在c#中字符串字符的二進制移位

MyString name = "string"; 

Console.Write(name<<3) // It will print **ingstr** by shifting last 3 to left 

我目前的實現如下:

public sealed class MyString 
{ 
    private readonly string _value=""; 

    public MyString(string str) 
    { 
     _value = str; 
    } 

    public override string ToString() 
    { 
     return _value; 
    } 

    public static implicit operator MyString(string str) 
    { 
     var myString = new MyString(str); 
     return myString; 
    } 

    public static explicit operator string(MyString myString) 
    { 
     return myString._value; 
    } 

    public override bool Equals(Object obj) 
    { 
     if (obj == null) 
     { 
      return false; 
     } 

     var s = obj as MyString; 
     if ((object)s == null) 
      return false; 

     return _value.Equals(obj); 
    } 

    public bool Equals(MyString str) 
    { 
     return _value.Equals(str); 
    } 

    public override int GetHashCode() 
    { 
     return _value.GetHashCode(); 
    } 

    public static bool operator ==(MyString a, MyString b) 
    { 
     return a._value.Equals(b.ToString()); 
    } 

    public static bool operator !=(MyString a, MyString b) 
    { 
     return !(a == b); 
    } 

    public static MyString operator <<(MyString s, int shift) 
    { 
     if (shift <= 0) 
     { 
      return s; 
     } 

     shift = shift % s._value.Length; 
     return s._value.Substring(shift, s._value.Length - shift) 
      + s._value.Substring(0, shift); 
    } 

    public static MyString operator >>(MyString s, int shift) 
    { 
     if (shift <= 0) 
      return s; 
     shift = shift%s._value.Length; 

     return s._value.Substring(shift, s._value.Length - shift) +    s._value.Substring(0,shift); 
    } 
} 

}

+3

首先,我勸你不要這樣做 - 但你試過嗎?你有多遠?你遇到了什麼問題? – 2012-04-14 08:41:29

+0

不要把它放在評論中 - 編輯你的*問題*。請閱讀http://tinyurl.com/so-hints – 2012-04-14 08:43:14

+0

所以你現在已經展示了你的實現 - 試圖實現shift操作符時出了什麼問題?你清楚知道如何爲'=='和'!='來重載操作符(雖然你有沒有重寫Equals和GetHashCode有點奇怪),那麼'<<'出了什麼問題? – 2012-04-14 08:48:20

回答

3

如果我真的需要它,我會寫沿着線的東西:

public static string operator << (MyString s, int shift) 
{ 
    if(shift <= 0) 
    { 
     return s; 
    } 

    shift = shift % s.Length; 
    return s.String.Substring(shift, s.Length - shift) 
     + s.String.Substring(0, shift); 
} 

雖然,目前還不清楚你爲什麼要實施這種轉變作爲一個運營商你自己的班級。如何在字符串本身上定義一個extension method?那麼你將能夠做到這樣的事情:

string str = "name".ShiftLeft(2); 
+1

我建議做轉移%s.Length而不是投擲IAE。 – SimpleVar 2012-04-14 08:54:47

+0

也會檢查零,以返回原始字符串。 – SimpleVar 2012-04-14 08:56:20

+0

@YoryeNathan謝謝,更改了代碼。 – 2012-04-14 08:57:00

相關問題