2015-10-12 4 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

строка sOne = "abcdefg"; string out1 = simplifyString (ref sOne); // аргумент должен быть передан без ссылки ref – xarzu

+0

, вы получаете одну строку, делаете что-то с ней и делаете другую, а затем возвращаете вторую. Зачем вам нужен первый, чтобы пройти как 'ref'? вы его не изменили. – aisa

0

Это область, где начинающие программисты C# ошибаются! Строка неизменна в C#, т. Е. Вы не можете изменить строку на C#!

Каждый раз, когда вы хотите отредактировать часть строки, вам нужно создать новый строковый объект и предоставить ему отредактированные значения. однако, если в вашей программе слишком много таких операций, это будет иметь заметные накладные расходы памяти! вся эта память не будет освобождена до тех пор, пока сборщик мусора .net не решит бежать! Если ваша строка включает в себя множество операций редактирования, используйте построитель строк!

Смежные вопросы