2015-06-27 2 views
2

У меня возникла проблема при разработке приложения. В принципе, у меня есть фиксированная строка, скажем, «IHaveADream»C# Конкатенатные строки или массив символов

Теперь я хочу, чтобы пользователь, чтобы вставить другую строку, для моей цели фиксированной длины, а затем сцепить каждый символ фиксированной строки с каждым символом строка, вставленная пользователем. , например. Пользователь вводит «ByeBye» , тогда выход будет: «IBHyaevBeyAeDream».

Как это сделать?

Я попытался с String.Concat и String.Join, внутри инструкции for, без везения.

ответ

4

Один эффективный с точки зрения памяти вариант заключается в использовании строкового построителя, поскольку как исходная строка, так и пользовательский ввод потенциально могут быть довольно большими. Как уже упоминалось Kris, вы можете инициализировать емкость StringBuilder для комбинированной длины обеих строк.

void Main() 
{ 
    var start = "IHaveADream"; 
    var input = "ByeBye"; 

    var sb = new StringBuilder(start.Length + input.Length); 

    for (int i = 0; i < start.Length; i++) 
    { 
     sb.Append(start[i]); 

     if (input.Length >= i + 1) 
      sb.Append(input[i]); 
    } 

    sb.ToString().Dump(); 
} 

Это только безопасно учитывает, что входная строка короче или равна длине начальной строки. Если у вас была более длинная строка ввода, вы бы хотели взять длинную длину в качестве конечной точки для своей итерации цикла и проверить, что каждый индекс массива не выходит за рамки.

void Main() 
{ 
    var start = "IHaveADream"; 
    var input = "ByeByeByeByeBye"; 

    var sb = new StringBuilder(start.Length + input.Length); 

    var length = start.Length >= input.Length ? start.Length : input.Length; 
    for (int i = 0; i < length; i++) 
    { 
     if (start.Length >= i + 1) 
      sb.Append(start[i]); 

     if (input.Length >= i + 1) 
      sb.Append(input[i]); 
    } 

    sb.ToString().Dump(); 
} 
+1

Поскольку вы эффективность использования памяти в качестве аргумента для использования StringBuilder, делают построить StringBuilder с начальной мощностью, равной длине выходной. –

+0

@ KrisVandermotten Отличная точка. Я обновил свой ответ, чтобы отразить ваш комментарий. –

0

Вы можете создать array of characters, а затем re-combine them в желаемом порядке.

char[] chars1 = "IHaveADream".ToCharArray(); 
char[] chars2 = "ByeBye".ToCharArray(); 

// you can create a custom algorithm to handle 
// different size strings. 
char[] c = new char[17]; 
c[0] = chars1[0]; 
c[1] = chars2[0]; 
... 
c[13] = chars1[10]; 

string s = new string(c); 
0

Если вы не заботитесь много об использовании памяти или Perfomance вы можете просто использовать:

public static string concatStrings(string value, string value2) 
    { 
     string result = ""; 
     int i = 0; 

     for (i = 0; i < Math.Max(value.Length, value2.Length) ; i++) 
     { 
      if (i < value.Length) result += value[i].ToString(); 
      if (i < value2.Length) result += value2[i].ToString(); 
     } 

     return result; 
    } 

Использование:

 string conststr = "IHaveADream"; 
     string input = "ByeBye"; 
     var result = ConcatStrings(conststr, input); 

     Console.WriteLine(result); 

Выход: IBHyaevBeyAeDream

P.S. Просто проверено выполнение обоих методов (с помощью strBuilder и простой канкатенции), и, похоже, оба этих метода выполняют одно и то же время для выполнения (если у вас есть только одна операция). Основная причина этого заключается в том, что построитель строк занимает много времени для инициализации, а с использованием конкатенации нам это не нужно.

Но в случае, если вам нужно обработать что-то вроде 1500 строк, то это разные истории, а построитель строк - это больше вариант.

Для выполнения 100 000 методов было показано 85 (str buld) против 22 (concat) ms соответственно.

My Code

+0

Я думаю, что вывод здесь неправильный, это 'IBHyaevBeyAe' вместо' IBHyaevBeyAeDream'. –

+0

Вы правы, исправили его – Fabjan

0
var firstString = "Ihaveadream"; 
var secondString = "ByeBye"; 
var stringBuilder = new StringBuilder(); 
for (int i = 0; i< firstString.Length; i++) { 
      stringBuilder .Append(str[i]); 
      if (i < secondString.Length) { 
      stringBuilder .Append(secondStr[i]); 
      } 
} 

var result = stringBuilder.ToString(); 
Смежные вопросы