2015-10-12 99 views
0
public string simplifyString(string sInput) 
{ 
     if (sInput.Length < 2) 
     { 
      return sInput; 
     } 

     string sOutput; 
     int iCount = 0; 

     for (int i=1; i < sInput.Length; i++) 
     { 
      if (sInput[i] != sInput[iCount]) 
      { 
       iCount++; 
       sOutput[iCount] = sInput[i]; 
      } 
     } 
     return sOutput; 
} 

預編譯器在上述C#代碼中存在問題。將字符分配給C中的字符串#

sOutput[iCount] = sInput[i]; 

此行有錯誤。它表示string.this [int]不能被分配並且是隻讀的。

+0

你到底想要達到什麼目的? – kevintjuh93

+0

他是對的,字符串是不可變的。你需要創建一個新的字符串,例如'StringBuilder'。 –

+0

是的,'sOutput [iCount]'返回該索引的字符,由於字符串是不可變的,所以這是正常的只讀。 –

回答

2

.NET中的字符串是不可變的,一旦創建它就無法更改。

如果您只需要更換字符(不刪除或添加),那麼你可以簡單地將其轉換爲一個數組前回字符串算賬:

var a = sOutput.ToCharArray(); 
// code that modifies a 
var s = new string(a); 

如果您需要能夠消除或加爲好,你可以使用一個StringBuilder

var sb = new StringBuilder(sOutput); 
// code that modifies sb 
var s = sb.ToString(); 
+1

即使你只需要替換字符,我更喜歡'StringBuilder'。您可以使用類似的代碼:'var sb = new StringBuilder(sOutput); sb [iCount] = sInput [i];'但是如果您想稍後添加或刪除字符,仍然可以使用它。 –

0

如果你改變你的代碼如下喜歡,我覺得你的問題將得到解決:

public string simplifyString(string sInput) 
{ 
    if (sInput.Length < 2) 
    { 
     return sInput; 
    } 

    string sOutput = sInput[0].ToString(); //Add initial for string 
    int iCount = 0; 

    for (int i=1; i < sInput.Length; i++) 
    { 
     if (sInput[i] != sInput[iCount]) 
     { 
      iCount++; 
      sOutput += sInput[i].ToString();//add new char as string to the end of the string 
     } 
    } 
    return sOutput; 
} 
+0

這可行,但將字符串傳遞給此方法有一些問題。 – xarzu

+0

string sOne =「abcdefg」; string out1 = simplifyString(ref sOne); //參數應該在沒有參考關鍵字 – xarzu

+0

的情況下傳遞,你得到一個字符串,用它做一些事情並做出另一個字符串,然後返回第二個字符串。爲什麼你需要第一個作爲'ref'傳遞?你甚至沒有改變它。 – aisa

0

這是一個嶄露頭角的c#程序員錯誤! 字符串在C#中是不可變的,即,您不能在C#中修改字符串!

每次要編輯字符串的一部分時,都需要創建一個新的字符串對象併爲其提供編輯後的值。然而,如果你的程序有太多這樣的操作,它會是一個可觀的內存開銷!所有這些內存將不會被釋放,直到.net的垃圾收集器決定運行! 如果你的字符串涉及很多編輯操作,請使用字符串生成器!