Как удвоить все вхождения символа в заданной строке.используя c # - PullRequest
2 голосов
/ 26 апреля 2011

Например, удвоение всех экземпляров «X» в строке «ABCXYZ» станет «ABCXXYZ»

Я думаю решить эту проблему:

  1. скопировать строку в массив char
  2. Пройдите весь массив и узнайте количество вхождений 'X' в строке
  3. узнать новую длину с # вхождениями * 2
  4. Итерация массива char и сохранение 'X' дважды для каждого вхождения 'X'
  5. Скопировать обратно массив символов в строку

Есть ли эффективный способ сделать это в c #, пожалуйста, предложите один

Спасибо

Ответы [ 4 ]

10 голосов
/ 26 апреля 2011

Метод Replace может сделать это:

"ABCXYZ".Replace("X","XX")

Если вы не знаете, какой символ заранее, вы можете сделать это с помощью строкового конструктора :

string s = "ABCXYZ";
char c = 'X';
s = s.Replace(new string(c,1),new string(c,2))
1 голос
/ 26 апреля 2011

ОК, с вашим новым требованием не использовать готовые строковые методы, как насчет:

var sbOut = new StringBuilder();
string myString = "ABCXYZ";
foreach (char c in myString) {
    sbOut.Append(c);
    if (c == 'X') {
        sbOut.Append(c);
    }
}
Console.WriteLine(sbOut.ToString());
0 голосов
/ 26 апреля 2011

Просто для удовольствия, и поскольку вы сказали, что не хотите использовать встроенный строковый метод, я написал метод расширения.Я понятия не имею, насколько это эффективно.Это должно быть довольно эффективно, но я не даю никаких гарантий.

public static class StringExt
{
    public static IEnumerable<char> DoubleChar(this IEnumerable<char> inString,
                                               char dupChar)
        {

         foreach (char c in inString)
         {
            yield return c;
            if (c == dupChar)
            {
                yield return c;
            }
         }
    }
}

Затем вы можете использовать это так:

string x = new string("ABCXYZ".DoubleChar('X').ToArray());

Это также позволяет объединять вызовы без необходимости делатьнесколько копий вашей строки.Таким образом, вы можете сделать что-то вроде этого:

string x = new string("ABCXYZ".DoubleChar('X').DoubleChar('Y').ToArray());
0 голосов
/ 26 апреля 2011

String.Replace даст вам правильную строку, я думаю, но она не даст вам количество замен. Чтобы сделать это эффективно, может быть что-то вроде этого:

char[] chars = string.ToCharArray();
char[] destchars = new char[chars.Length * 2]; // Max possible string size
int xidx = 0;

// Replace the X's
for(int i = 0; i < chars.Length; ++i)
{
   if(chars[i] == 'X')
   {
      destchars[xidx] = destchars[xidx + 1] = chars[i];
      xidx += 2;
   }
   else
      destchars[xidx++] = chars[i];
}

int numberOfXs = (xidx - chars.Length);
string newstr = new string(destchars, xidx);

Я набрал это вручную и не запускал и не отлаживал, но вы поняли идею. Это может быть слишком много памяти с буфером двойного размера в дополнение к копиям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...