2015-06-27 43 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(); 
} 

這隻能安全地解釋輸入字符串的長度與起始字符串的長度短或相等。如果你有一個更長的輸入字符串,你會希望將更長的長度作爲for循環迭代的終點,並檢查每個數組索引是否超出範圍。

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

如果你不那麼在意內存使用或性能比較你可以使用:

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

附: 只需檢查兩種方法的性能(使用strBuilder和簡單的cancatenation),看起來這兩種方法都需要相同的時間來執行(如果只有一個操作)。其主要原因是字符串生成器需要大量的時間來初始化,而使用串聯我們不需要。

但是萬一你要處理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();